你的位置:
问答吧
-> Oracle
-> 问题详情
Oracle存储过程的测试问题
这个是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
请各位帮忙看一下是什么问题,谢谢
作者: longwentao
发布时间: 2011-06-16
sql_str:='select empno,ename,sal from emp where empno:=x_id';
这一句有问题
作者: biandongfeng
发布时间: 2011-06-16
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;
作者: tangren
发布时间: 2011-06-16