这个是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
请各位帮忙看一下是什么问题,谢谢
--定义包头
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
请各位帮忙看一下是什么问题,谢谢
解决方案 »
- 字符串轉時間類型的問題
- 建函数问题_如何返回父id?
- 一个SQL语句
- 急啊!!新手误删了oracle数据库里面的数据,数据都不见了,怎么才能恢复呀??
- 涉及表名,什么情况下要用引号包括,什么时候不需要?
- VB连接Oracle出现错误“Error while trying to retrieve text for error ORA-12154”
- 急[监听器]是对谁而言?谁用了我的监听器~
- SUBSTR(RTRIM(LTRIM(T_4.KANJI_SHIMEI_SEI))...甚么意思?
- 存储过程中的动态SQL
- 几个.txt文件中的数据导入到一个oracle数据表中的方法
- 无效的游标
- oracle中数据丢失的问题?
这一句有问题
--弱类型的游标,可接收任何返回值
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;