0

我需要一个 IN OUT 参数以及一个引用游标作为存储过程的返回值。目前我正在关注。

create table dept
( dept_id number,
  name varchar2(40),
  location varchar2(200)
);

CREATE OR REPLACE PACKAGE HR.SP_PACKAGE AS 

  TYPE dept_type IS REF CURSOR RETURN HR.dept%ROWTYPE;

END SP_PACKAGE;

CREATE OR REPLACE PROCEDURE HR.MIXED_IN_INOUT_REF_PARAM 
(
  P_ID IN NUMBER  
, P_NAME_TO_LOCATION IN OUT VARCHAR2  
, P_RCURSOR OUT SP_PACKAGE.dept_type
) AS 
BEGIN
  SELECT name INTO P_NAME_TO_LOCATION FROM HR.dept WHERE dept_id = p_id AND name =  P_NAME_TO_LOCATION;
  OPEN P_RCURSOR FOR
      select *
      from HR.dept;
END MIXED_IN_INOUT_REF_PARAM;

即使编译成功,我在运行时也会遇到一些错误。

ORA-06550: line 4, column 17:
PLS-00201: identifier 'CURSOR' must be declared
ORA-06550: line 4, column 13:
PL/SQL: Item ignored
ORA-06550: line 12, column 18:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 9, column 3:
PL/SQL: Statement ignored
ORA-06550: line 21, column 17:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 21, column 3:
PL/SQL: Statement ignored

我正在使用 Sql 开发人员。任何帮助表示赞赏。

4

2 回答 2

0

您的 proc 没有问题chamibuddhika,我认为您的调用方式有问题。我尝试创建相同的程序,它工作正常。尝试运行您的程序,如下所示:

declare
v_temp varchar2(200):='ACCOUNTING';
rec SP_PACKAGE.dept_type;
v_rec rec%ROWTYPE;

begin
MIXED_IN_INOUT_REF_PARAM(10,v_temp,rec);

LOOP
FETCH rec INTO v_rec;
EXIT WHEN rec%NOTFOUND;
 dbms_output.put_line(v_rec.name);

END LOOP;

end;

输出

 ACCOUNTING
 RESEARCH
 SALES
 OPERATIONS

你的 proc 有一个问题,当 proc 内的查询没有返回任何内容时,它会给你no_data_found异常。所以你需要在你的 proc 中处理它。

于 2012-08-12T14:30:35.430 回答
0

像这样更改删除返回

CREATE OR REPLACE PACKAGE HR.SP_PACKAGE AS 

  TYPE dept_type IS REF CURSOR ;

END SP_PACKAGE;

你可以让它像这样更有活力

open p_cursor FOR  'SELECT *  FROM DEPT where ' ||  V_WHERE;
于 2012-08-12T09:06:22.727 回答