你第一个错误是有的,确实不存在那个视图,所以编译不会通过。
第二个,过程里面不支持这样写的,你在第一个里头,不是用了execute immediate,这个就好。你的要求,可以用动态游标,csdn上有很多,我帮你找个简单的
/*用动态游标:
type myCurType is ref cursor;
L_cursor myCurType;
mySql string(200);
...
begin
mySql:=select count(*) from view_show';
open L_cursor for mySql;
...
*/ 对了的话,就给分哦~
第二个,过程里面不支持这样写的,你在第一个里头,不是用了execute immediate,这个就好。你的要求,可以用动态游标,csdn上有很多,我帮你找个简单的
/*用动态游标:
type myCurType is ref cursor;
L_cursor myCurType;
mySql string(200);
...
begin
mySql:=select count(*) from view_show';
open L_cursor for mySql;
...
*/ 对了的话,就给分哦~
create or replace procedure pro_show
as
begin
create or replace view view_show
as
select * from person;
end;
DDL语句只能通过动态SQL语句来执行。execute immediate
你的数据库版本号是多少?只有8I以上才能这样使用
有一点注意,执行存储过程的用户有操作person表的权限吗?
create or replace function test1 return varchar2 as
strsql varchar2(200);
begin
execute immediate 'create or replace view view_name...';
commit;
return sqlerrm;
exception
when others then
return sqlerrm;
end;create or replace function test return varchar2 as
v_cursor number;
v_string varchar2(200);
v_row number;
begin
v_cursor:=dbms_sql.open_cursor;
v_string:='create table testdb (text varchar2(200))';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
return ('成功执行'||v_row||'行!');
exception
when others then
dbms_sql.close_cursor(v_cursor);
return ('执行失败!'||sqlcode||sqlerrm);
raise;
end;
首先,我用的这个用户是有对person表和存储过程完全操作的权限的。
其次,在procedure中不能直接写create or replace view...,这个我知道了。但是,用execute immediate也还是不行啊。就像我第一个写的,
create or replace procedure pro_show
as
begin
declare
vchar varchar2(100);
cnt int;
begin
vchar:='create or replace view view_show as select * from person';
execute immediate vchar;
select count(*) into cnt from view_show;
end;
end;
就是用了execute immediate了呀。我又在加一个commit也一样不行。还是表或视图不存在的错误。那我还怎么在这个存储过程中对这些数据进行其他的操作啊!
leborety说用游标,这个不行。因为我通过视图得到这些数据后,还要有一些其他类型的操作是游标不能完成的。
所以,还请各位大哥在帮帮小妹把。(苯苯的小妹):)
有多多的分送哦。
create or replace function test return varchar2 as
v_cursor number;
v_string varchar2(200);
v_row number;
begin
v_cursor:=dbms_sql.open_cursor;
v_string:='create table testdb (text varchar2(200))';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
return ('成功执行'||v_row||'行!');
exception
when others then
dbms_sql.close_cursor(v_cursor);
return ('执行失败!'||sqlcode||sqlerrm);
raise;
end;把上面这一段修改一下.
你还没明白,view_show 这个视图确实不存在,所以编译不通过。你这个情况,用动态的写,把view_show作为一个变量传入就可以了。
你什么要求,完成不了?可以写出来,这里的高手都帮你解决的。我也学习下。