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;
/

解决方案 »

  1.   

    p_rc out rec_pag.rc是什么来的?请继续指教,怎么调用以上过程?帮我入门吧,我看书看得很糊涂,谢谢。
      

  2.   

    in SQLPlus: exec rec_pag.listdata ;
      

  3.   

    SQL> begin
      2  exec rec_pag.listdata ;
      3  end;
      4  /
    exec rec_pag.listdata ;
         *
    ERROR 位于第 2 行:
    ORA-06550: 第 2 行, 第 6 列:
    PLS-00103: 出现符号 "REC_PAG"在需要下列之一时:
    := . ( @ % ;
    符号 ":=" 被替换为 "REC_PAG" 后继续。
      

  4.   

    用包定义了一个游标对象。在过程参数已对它进行了定义了。在sql*puls中执行以下:
    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;
      

  5.   

    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" 后继续。怎么回事?请大家指点迷津,谢谢。
      

  6.   

    SQL> declare
      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" 后继续。还是不行,真是急死了.......
      

  7.   

    是否已按照我的步骤先一个包头。
    过程内部参数直接写包头名作前缀,引出游标变量。(调用过程不用包名的)谁说表名要用引号,确定表名存在。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;
    /
      

  8.   

    去除exce,
    begin
      pro_name(...);
    end;
      

  9.   

    以下是完整的运行过程,Beckhambobo,请您指出其中错误,万分感谢。SQL> create or replace package rec_pag as
      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" 后继续。
      

  10.   

    创建顺序要注意,不然过程会失效。先创建包头,再创建过程。直接执行以下看是否正确:
    declare
    v_rc rec_pag.rc;
    begin
    exec listdata(emp,v_rc);
    end;一步一步细心检查,总会找出错误原因的
      

  11.   

    SQL> declare
      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" 后继续。
      

  12.   

    sor.job是否已超过255字符,dbms_output包只能显示到255字符,过了就会报错.
      

  13.   

    名称                                      是否为空? 类型
    ----------------------------------------- -------- ----------------------------
    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)
      

  14.   

    修改如下:看怎样?
    str:='select * from'||' '||tablename;
      

  15.   

    不行,还是出现以下错误,到底是什么来的?唉......
    exec listdata(emp,v_rc);
         *
    ERROR 位于第 4 行:
    ORA-06550: 第 4 行, 第 6 列:
    PLS-00103: 出现符号 "LISTDATA"在需要下列之一时:
    := . ( @ % ;
    符号 ":=" 被替换为 "LISTDATA" 后继续。
      

  16.   

    现在没有测试环境,帮不了,若不着急,春节过后帮你解决。不用急,开开心心过肥年!good luck
      

  17.   

    如果没有exec,会出现以下:
    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
      

  18.   

    emp没有定义到是什么类型,可以理解为oracle认不到它是值还是变量.
      

  19.   

    declare
    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;
    /
      

  20.   

    SQL> declare
      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
      

  21.   

    SQL> declare
      2   v_rc rec_pag.rc;
      3  begin
      4  listdata('emp',v_rc);
      5  end;
      6  /PL/SQL 过程已成功完成。如果是这样,就没有出错,看来,emp-〉'emp'是一定的。
      

  22.   

    5  for sor in v_rc loop
      6  dbms_output.put_line(sor.empno,sor.job);
      7  end loop;Beckhambobo,看来是这段程序出错呢。
      

  23.   

    declare
    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;
    /
      

  24.   

    成功了,哈哈哈哈,谢谢,不过要对您的修改一下,再次万分感谢。declare
    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;
    /