你第一个错误是有的,确实不存在那个视图,所以编译不会通过。
第二个,过程里面不支持这样写的,你在第一个里头,不是用了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;
...
*/ 对了的话,就给分哦~

解决方案 »

  1.   

    存储过程里
    create or replace procedure pro_show
    as
    begin
    create or replace view view_show 
    as 
    select * from person;
    end;
    DDL语句只能通过动态SQL语句来执行。execute immediate 
    你的数据库版本号是多少?只有8I以上才能这样使用
      

  2.   

    同意楼上的。
    有一点注意,执行存储过程的用户有操作person表的权限吗?
      

  3.   

    给你动态语句执行的函数供参考.
    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;
      

  4.   

    谢谢各位大哥的热心帮忙。不过我现在还是没能实现啊。
    首先,我用的这个用户是有对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说用游标,这个不行。因为我通过视图得到这些数据后,还要有一些其他类型的操作是游标不能完成的。
    所以,还请各位大哥在帮帮小妹把。(苯苯的小妹):)
    有多多的分送哦。
      

  5.   

    用我上面的那个函数不行?
    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;把上面这一段修改一下.
      

  6.   

    (苯苯的小妹):)select count(*) into cnt from view_show;
    你还没明白,view_show 这个视图确实不存在,所以编译不通过。你这个情况,用动态的写,把view_show作为一个变量传入就可以了。
    你什么要求,完成不了?可以写出来,这里的高手都帮你解决的。我也学习下。