我正在尝试使用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;
答案 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)
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中复制它们。