create or replace package temppkg
is
l_sql_create varchar2(200);
type mytable is ref cursor;
procedure test_1(cur_mytable out mytable,deptno1 in emp.deptno%type);
end;create or replace package body temppkg
is 
procedure test_1(cur_mytable out mytable,deptno1 in emp.deptno%type)
is
begin
         l_sql_create:='create  view zd_hmzl 
                          as 
                           (
                            select ename,deptno from emp union all select dname,deptno from dept
                           )';  
          execute immediate l_sql_create;          open cur_mytable for select * from emp left join zd_hmzl on emp.ename = zd_hmzl.ename where emp.deptno = deptno1;
end test_1;
end temppkg;
提示错误:
PL/SQL: SQL Statement ignored
PL/SQL: ORA-00942: 表或视图不存在

解决方案 »

  1.   

    设计有问题,动态创建视图的设计不是合理的设计,原因如下:
    1. 如果这个视图在该代码段之外使用,则创建的代码就不应当写在这里,应当在数据库设计中创建。
    2. 如果这个视图只在该代码段之内使用,则应当用临时视图with ... as来解决。
      

  2.   

    你这个错误是由于视图不存在,而存储过程编译到
    open cur_mytable for select * from emp left join zd_hmzl 报出的。虽然你在上面有创建语句,但是存储过程编译的时候此视图并不存在,因此编译过程中在查找对象是否存在时报错。解决方法:
    1、将此视事先图创建,然后存储过程中改为 create or replace view zd_hmzl 
    2、将 select * from emp left join zd_hmzl on emp.ename = zd_hmzl.ename where emp.deptno = deptno1;
       定义成字符串,存在一个变量里面如:SQL_STR
       最后只需要 open cur_mytable for SQL_STR
       但是这样改也得配合 create or replace view zd_hmzl,否则第一次没问题,第二以运行就会出错。
      

  3.   


    open cur_mytable for 'select * from emp left join zd_hmzl on emp.ename = zd_hmzl.ename where emp.deptno = :deptno' using deptno1;
      

  4.   


    这里有问题啊,在说了这是一个包,不是存储过程,在包头中定义方法,在包身中来实现,你没有在包体中实现你的那个存储过程的方法create or replace package temppkg
    is
    l_sql_create varchar2(200);
    type mytable is ref cursor;
    begin
    create or replace procedure test_1(cur_mytable out mytable,deptno1 in emp.deptno%type)
    as 
      存储过程要完成的任务
    begin
    end;
    end;
    即使这样的写法
      

  5.   

    create or replace package body temppkg
    is 
    procedure test_1(cur_mytable out mytable,deptno1 in emp.deptno%type)
    is
    begin
             l_sql_create:='create  view zd_hmzl 
                              as 
                               (
                                select ename,deptno from emp union all select dname,deptno from dept
                               )';  
              execute immediate l_sql_create;          open cur_mytable for 'select * from emp left join zd_hmzl on emp.ename = zd_hmzl.ename where emp.deptno = '||deptno1;
    end test_1;
    end temppkg;