从SQL Developer输出Oracle存储过程的结果

时间:2011-01-12 08:09:30

标签: oracle plsql oracle-sqldeveloper

我正在尝试使用SQL Developer调用Oracle存储过程。 proc使用sys_refcursor输出结果。我右键单击proc窗口,弹出Run PL / SQL窗口。当我选择proc我想要它为我创建所有输入参数等。下面是我用来尝试循环sys_refcursor并输出结果的代码,但我在'v_rec v_Return%rowtype;'上收到错误line:

ORA-06550:第6行第9列: PLS-00320:此表达式类型的声明不完整或格式错误。 ORA-06550:第6行第9列: PL / SQL:项目被忽略

供应商代码6550

我在其他几个网站上找到了循环代码,它似乎是这样做的方式,但无论我尝试什么,它都不适合我。另一个问题 - 在DBMS_OUTPUT.PUT_LINE('name ='|| v_rec.ADM)上我正确引用了v_rec,即是v_rec。“column_name”正确的方法??

我不习惯使用Oracle而且从未使用过SQL plus。任何建议赞赏。

DECLARE
  P_CAE_SEC_ID_N NUMBER;
  P_PAGE_INDEX NUMBER;
  P_PAGE_SIZE NUMBER;
  v_Return sys_refcursor;
  v_rec v_Return%rowtype;
BEGIN
  P_CAE_SEC_ID_N := NULL;
  P_PAGE_INDEX := 0;
  P_PAGE_SIZE := 25;

  CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N,
    P_PAGE_INDEX => P_PAGE_INDEX,
    P_PAGE_SIZE => P_PAGE_SIZE,
    P_FOF_SEC_REFCUR => v_Return
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = ');
  loop
    fetch v_Return into v_rec;
    exit when v_Return%notfound;
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ADM);
  end loop;

END;

3 个答案:

答案 0 :(得分:4)

你的问题在这里:

v_Return sys_refcursor;
v_rec v_Return%rowtype;

v_Return是一个游标变量,没有特定的结构(列列表),因此v_Return%rowtype不是声明v_rec的有效记录结构。对程序的不同调用甚至可以返回具有不同结构的游标。

您知道您期望返回游标的结构是什么(但Oracle没有),因此您需要明确定义适当的记录结构,例如。

type t_row is record (empno number, ename varchar2(30));
v_rec t_row;

答案 1 :(得分:3)

您需要一个强类型的引用游标才能将其定义为%ROWTYPE。

示例here

答案 2 :(得分:0)

@Tony安德鲁斯感谢这一点,它让我更好地了解我哪里出错了。虽然仍有问题 - 这是我的proc的缩短版本。它有点复杂,因为它从子查询和其他两个值中选择所有字段:

open p_fof_sec_refcur for    

SELECT *
FROM( 
    SELECT securities.*, rownum rnum, v_total_count 
    FROM
        (
        SELECT
          CFS.CAE_SEC_ID,
          CFS.FM_SEC_CODE,
          ...
        FROM
        CAEDBO.CAE_FOF_SECURITY CFS
        INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
            ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS)
        ...
        WHERE APPR_STATUS = NVL(p_appr_status, APPR_STATUS)
        ...
          )securities
      )   

  WHERE rnum between v_pgStart and v_pgEnd;

我明确定义了输出结构如下,以匹配proc的返回字段,但我仍然收到错误:

v_Return sys_refcursor;
type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),...rnum number, v_total_count number);
v_rec t_row;

我得到的错误是

ORA-06504: PL/SQL: Return types of Result Set variables or query do not match
ORA-06512: at line 45

我只是想知道“rownum rnum,v_total_count”部分让我沮丧。我很确定输出结构中的所有其他字段都是正确的,因为我直接从proc中复制它们。