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: 表或视图不存在
解决方案 »
- Win2008 R2如何安装Oracle 10G R2 RAC?
- Oralce10g 使用impdp命令导入大批量数据问题
- ORACLE FUNCTION问题,大惑不解请高手指点如何解决?
- 安装oracle出现out of memory
- oracle 语句 截取之后有重复的 怎么去除重复的值
- 高分请教关于连接查询速度
- 我想创建一个表空间,数据文件最大能设置多大?我想设20G,会不会太大?
- 无法启动OracleOraHome05HttpServer服务?
- linux下安裝oracle920db,ORA-03113错误怎么解决
- oracle,decode函数输出为什么不正常
- oracle 空间不够 请帮忙
- Tuxedo 10gR3 for MS Windows Server 2008 w/MS VS 2008 x86-64 64-bit在哪里可以下载
1. 如果这个视图在该代码段之外使用,则创建的代码就不应当写在这里,应当在数据库设计中创建。
2. 如果这个视图只在该代码段之内使用,则应当用临时视图with ... as来解决。
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,否则第一次没问题,第二以运行就会出错。
open cur_mytable for 'select * from emp left join zd_hmzl on emp.ename = zd_hmzl.ename where emp.deptno = :deptno' using deptno1;
这里有问题啊,在说了这是一个包,不是存储过程,在包头中定义方法,在包身中来实现,你没有在包体中实现你的那个存储过程的方法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;
即使这样的写法
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;