oracle存储过程和测试,Oracle存储过程的测试问题

你的位置:

问答吧

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值