2011-01-12 123 views
1

我想使用SQL Developer调用Oracle存储过程。 proc使用sys_refcursor输出结果。我右键单击进入运行PL/SQL窗口的proc窗口。当我选择proc时,我希望它为我创建所有输入参数等。下面是我用来通过sys_refcursor循环并输出结果的代码,但是我在'v_rec v_Return%rowtype'中得到一个错误;'行:来自SQL Developer的Oracle存储过程的输出结果

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; 

回答

4

你的问题是在这里:

v_Return sys_refcursor; 
v_rec v_Return%rowtype; 

V_RETURN是一个游标变量并没有具体的结构(列的列表),所以V_RETURN%ROWTYPE不是一个有效的记录结构来声明v_rec。对过程的不同调用甚至有可能返回具有不同结构的游标。

你知道你期待返回光标的结构是(但甲骨文没有),所以你需要例如明确定义相应的记录结构

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

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

here

0

@Tony安卓感谢,它给了我一个更好的主意,我要去哪里错了。虽然仍然有问题 - 这是我的proc的缩短版本。这是一个有点复杂的,它的选择从一个子查询各个领域和其他2个值:

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中复制它们。