这个是Oracle源码:
--定义包头
create or replace package pack_emp
is
--弱类型的游标,可接收任何返回值
type cursor_type is ref cursor;
procedure findAll(p_no number,p_cursor out cursor_type);
return number;
end pack_emp;--实现包体
create or replace package body pack_emp
is
procedure findAll(p_no number,p_cursor out cursor_type)
is
sql_str varchar2(100);
begin
if p_no=0 then
open p_cursor for select empno,ename,sal from emp;
else
sql_str:='select empno,ename,sal from emp where empno:=x_id';
open p_cursor for sql_str using p_no;
end if;
end findAll;end  pack_emp;--测试findAll
declare
cursor p_cursor is  select empno,ename,sal from emp;
myrecord p_cursor%rowtype;
mycur pack_emp.cursor_type;
begin
pack_emp.findAll(7788,mycur);
loop
fetch mycur into myrecord;
exit when p_cursor%notfound;
dbms_output.put_line(myrecord.ename);
end loop; end;我使用的是Oracle默认用户下的emp表,findAll()函数功能为:如果用户输入为0,则查询所有用户的编号,用户名官薪水,如果输入用户编号,则查询该用户的编号,用户名及薪水。包头和包体都能正常创建,但在测试代码中,出现了问题,当输入0时,错误如下:
    第 1 行出现错误:
   ORA-01001: 无效的游标
   ORA-06512: 在 line 8
当输入任意一个正确编号时,如7788,错误如下:
   第 1 行出现错误:
   ORA-00920: 无效的关系运算符
   ORA-06512: 在 "SCOTT.PACK_EMP", line 56
   ORA-06512: 在 line 6
请各位帮忙看一下是什么问题,谢谢

解决方案 »

  1.   

    sql_str:='select empno,ename,sal from emp where empno:=x_id';
    这一句有问题
      

  2.   

    CREATE OR REPLACE PACKAGE pack_emp IS
      --弱类型的游标,可接收任何返回值
      TYPE cursor_type IS REF CURSOR;
      PROCEDURE findAll(p_no NUMBER, p_cursor OUT cursor_type);
      --RETURN NUMBER; --这个是多余的吧
    END pack_emp;--实现包体
    CREATE OR REPLACE PACKAGE BODY pack_emp IS
      PROCEDURE findAll(p_no NUMBER, p_cursor OUT cursor_type) IS
        sql_str VARCHAR2(100);
      BEGIN
        IF p_no = 0 THEN
          OPEN p_cursor FOR
            SELECT empno, ename, sal FROM emp;
        ELSE
          --sql_str := 'select empno,ename,sal from emp where empno:=x_id';--绑定变量写成了赋值号
          sql_str := 'select empno,ename,sal from emp where empno=:x_id';
          OPEN p_cursor FOR sql_str
            USING p_no;
        END IF;
      END findAll;END pack_emp;--测试findAll
    DECLARE
      --为了声明一个行记录变量声明一个游标
      --虽然没有错,但觉得挺别扭
      CURSOR p_cursor IS
        SELECT empno, ename, sal FROM emp;
      
      myrecord p_cursor%ROWTYPE;
      mycur    pack_emp.cursor_type;
    BEGIN
      pack_emp.findAll(7788, mycur);
      LOOP
        FETCH mycur
          INTO myrecord;
        --EXIT WHEN p_cursor%NOTFOUND; --游标名称写错
          EXIT WHEN mycur%NOTFOUND;
        dbms_output.put_line(myrecord.ename);
      END LOOP;END;