使用oracle中的refcursor检索具有多个列值的记录集

时间:2012-11-19 05:16:03

标签: plsql package procedure ref-cursor

我在pl / sql中创建一个包。在这个我声明了引用游标。在程序中使用具有多个列名的select语句。但我无法得到结果。 在这里我附上了我的代码。帮我纠正错误。是pl / sql的新手

code

CREATE OR REPLACE PACKAGE types AS 
  TYPE cursor_type IS REF CURSOR;
END Types; 
/

CREATE OR REPLACE
PROCEDURE get_CDR_rs (p_no    IN  zkv.FLD_callingPartyNumber%TYPE,
                  CDR_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
 OPEN CDR_recordset FOR
SELECT  FLD_callingPartyNumber,
       FLD_dateTimeConnect

FROM   CISCOCUIC_TBL
WHERE  FLD_callingPartyNumber= p_no
ORDER BY FLD_callingPartyNumber,;
END get_CDR_rs;
/



SET SERVEROUTPUT ON SIZE 1000000
DECLARE
  l_cursor  SYS_REFCURSOR;
  l_callingPartyNumber   zkv.FLD_callingPartyNumber%TYPE;
  l_dateTimeConnect  zkv.FLD_dateTimeConnect%TYPE;
BEGIN

LOOP 
FETCH l_cursor
INTO  l_callingPartyNumber, l_dateTimeConnect;
EXIT WHEN l_cursor%NOTFOUND;

END LOOP;
CLOSE l_cursor;
END;
/


Error

9/41    PL/SQL: ORA-00936: missing expression
5/5     PL/SQL: SQL Statement ignored

1 个答案:

答案 0 :(得分:1)

首先,程序中存在语法错误。它应该是

CREATE OR REPLACE
PROCEDURE get_CDR_rs (p_no    IN  zkv.FLD_callingPartyNumber%TYPE,
                  CDR_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
 OPEN CDR_recordset FOR
SELECT  FLD_callingPartyNumber,
       FLD_dateTimeConnect

FROM   CISCOCUIC_TBL
WHERE  FLD_callingPartyNumber= p_no
ORDER BY FLD_callingPartyNumber; -- there was a comma which is not required or you    
--   missed a column
END get_CDR_rs;
/

其次,get_CDR_rs被调用以检索结果?

第三,为什么你需要以下?因为你正在使用sys_refcursor

CREATE OR REPLACE PACKAGE types AS 
  TYPE cursor_type IS REF CURSOR;
END Types; 
/

如果您希望查看返回sys_refcursor的过程结果,请执行以下操作

variable rset refcursor;

DECLARE
  p_no  zkv.FLD_callingPartyNumber%TYPE;
BEGIN
  p_no := '123';
  get_CDR_rs (p_no, :rset);  
END;
/

print rset