create or replace package rec_pag as
type rc is ref cursor;
end rec_pag;
/
create or replace procedure listdata (tablename in varchar2,p_rc out rec_pag.rc) as
str varchar2(50);
begin
str:='select * from '|| tablename;
open p_rc for str;
end listdata;
/
type rc is ref cursor;
end rec_pag;
/
create or replace procedure listdata (tablename in varchar2,p_rc out rec_pag.rc) as
str varchar2(50);
begin
str:='select * from '|| tablename;
open p_rc for str;
end listdata;
/
2 exec rec_pag.listdata ;
3 end;
4 /
exec rec_pag.listdata ;
*
ERROR 位于第 2 行:
ORA-06550: 第 2 行, 第 6 列:
PLS-00103: 出现符号 "REC_PAG"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "REC_PAG" 后继续。
set serveroutput on
declare
v_rc rec_pag.rc;
begin
exec listdata(students,v_rc);
for sor in v_rc loop
dbms_output.put_line(sor.col1,sor.col2,....); --列出所以列名
end loop;
end;
2 v_rc rec_pag.rc;
3 begin
4 exec listdata('emp',v_rc);
5 for sor in v_rc loop
6 dbms_output.put_line(sor.empno,sor.job);
7 end loop;
8 end;
9 /
exec listdata('emp',v_rc);
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 6 列:
PLS-00103: 出现符号 "LISTDATA"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "LISTDATA" 后继续。怎么回事?请大家指点迷津,谢谢。
2 v_rc rec_pag.rc;
3 begin
4 exec rec_pag.listdata('emp',v_rc);
5 for sor in v_rc loop
6 dbms_output.put_line(sor.empno,sor.job);
7 end loop;
8 end;
9 /
exec rec_pag.listdata('emp',v_rc);
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 6 列:
PLS-00103: 出现符号 "REC_PAG"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "REC_PAG" 后继续。还是不行,真是急死了.......
过程内部参数直接写包头名作前缀,引出游标变量。(调用过程不用包名的)谁说表名要用引号,确定表名存在。declare
v_rc rec_pag.rc;
begin
exec listdata(emp,v_rc);
for sor in v_rc loop
dbms_output.put_line(sor.empno,sor.job);
end loop;
end;
/
begin
pro_name(...);
end;
2 type rc is ref cursor;
3 end rec_pag;
4 /程序包已创建。SQL> create or replace procedure listdata (tablename in varchar2,p_rc out rec_pag.rc) as
2 str varchar2(50);
3 begin
4 str:='select * from '|| tablename;
5 open p_rc for str;
6 end listdata;
7 /过程已创建。SQL>
SQL>
SQL> declare
2 v_rc rec_pag.rc;
3 begin
4 exec listdata(emp,v_rc);
5 for sor in v_rc loop
6 dbms_output.put_line(sor.empno,sor.job);
7 end loop;
8 end;
9 /
exec listdata(emp,v_rc);
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 6 列:
PLS-00103: 出现符号 "LISTDATA"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "LISTDATA" 后继续。
declare
v_rc rec_pag.rc;
begin
exec listdata(emp,v_rc);
end;一步一步细心检查,总会找出错误原因的
2 v_rc rec_pag.rc;
3 begin
4 exec listdata(emp,v_rc);
5 end;
6 /
exec listdata(emp,v_rc);
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 6 列:
PLS-00103: 出现符号 "LISTDATA"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "LISTDATA" 后继续。
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
str:='select * from'||' '||tablename;
exec listdata(emp,v_rc);
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 6 列:
PLS-00103: 出现符号 "LISTDATA"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "LISTDATA" 后继续。
SQL> declare
2 v_rc rec_pag.rc;
3 begin
4 listdata(emp,v_rc);
5 for sor in v_rc loop
6 dbms_output.put_line(sor.empno,sor.job);
7 end loop;
8 end;
9 /
listdata(emp,v_rc);
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 10 列:
PLS-00357: 在此上下文中不允许表,视图或序列引用 'EMP'
ORA-06550: 第 4 行, 第 1 列:
PL/SQL: Statement ignored
ORA-06550: 第 5 行, 第 12 列:
PLS-00221: 'V_RC' 不是过程或尚未定义
ORA-06550: 第 5 行, 第 1 列:
PL/SQL: Statement ignored
v_rc rec_pag.rc;
col1 NUMBER(4);
col2 VARCHAR2(9);
begin
listdata('EMP',v_rc);
loop
fetch v_rc into col1,col2;
dbms_output.put_line(col1,col2);
exit when v_rc%nofound;
end loop;
end;
/
2 v_rc rec_pag.rc;
3 col1 NUMBER(4);
4 col2 VARCHAR2(9);
5 begin
6 listdata('EMP',v_rc);
7 loop
8 fetch v_rc into col1,col2;
9 dbms_output.put_line(col1,col2);
10 exit when v_rc%nofound;
11 end loop;
12 end;
13 /
dbms_output.put_line(col1,col2);
*
ERROR 位于第 9 行:
ORA-06550: 第 9 行, 第 1 列:
PLS-00306: 调用 'PUT_LINE' 时参数个数或类型错误
ORA-06550: 第 9 行, 第 1 列:
PL/SQL: Statement ignored
ORA-06550: 第 10 行, 第 16 列:
PLS-00208: 标识符 'NOFOUND' 不是合法的游标属性
ORA-06550: 第 10 行, 第 1 列:
PL/SQL: Statement ignored
2 v_rc rec_pag.rc;
3 begin
4 listdata('emp',v_rc);
5 end;
6 /PL/SQL 过程已成功完成。如果是这样,就没有出错,看来,emp-〉'emp'是一定的。
6 dbms_output.put_line(sor.empno,sor.job);
7 end loop;Beckhambobo,看来是这段程序出错呢。
v_rc rec_pag.rc;
v_emp emp%rowtype;
begin
listdata('EMP',v_rc);
loop
fetch v_rc into v_emp;
exit when v_rc%notfound;
dbms_output.put_line(v_emp.empno,v_emp.job);
end loop;
end;
/
v_rc rec_pag.rc;
v_emp emp%rowtype;
begin
listdata('EMP',v_rc);
loop
fetch v_rc into v_emp;
exit when v_rc%notfound;
dbms_output.put_line(to_char(v_emp.empno) || ' ' || to_char(v_emp.job));
end loop;
end;
/