Oracle 如何使用多个表循环SYS\u REFCURSOR?
对不起,这个问题的标题太宽泛了,但我没有找到进一步简化的方法 我正在为客户端创建一个包,这个包有一个过程,返回一个Oracle 如何使用多个表循环SYS\u REFCURSOR?,oracle,stored-procedures,plsql,oracle9i,Oracle,Stored Procedures,Plsql,Oracle9i,对不起,这个问题的标题太宽泛了,但我没有找到进一步简化的方法 我正在为客户端创建一个包,这个包有一个过程,返回一个SYS\u REFCURSOR。为其提供信息的查询是一个包含大约20个字段的多表选择。在第二个过程中,我需要调用这个过程,并循环遍历结果以提供其他位置 在循环的部分使用时遇到问题。我无法使用表%ROWTYPE。我试图在过程中声明一个对象,但不允许。我需要做一个将XXX提取到单个变量列表中吗 DECLARE dt_field TABLE1.dt_field%TYPE;
SYS\u REFCURSOR
。为其提供信息的查询是一个包含大约20个字段的多表选择。在第二个过程中,我需要调用这个过程,并循环遍历结果以提供其他位置
在循环的部分使用时遇到问题。我无法使用表%ROWTYPE
。我试图在过程中声明一个对象
,但不允许。我需要做一个将XXX提取到单个变量列表中吗
DECLARE
dt_field TABLE1.dt_field%TYPE;
p_resultset SYS_REFCURSOR;
p_individual OBJECT (
FIELD0 DATE,
FIELD1 TABLE.FIELD1%TYPE,
FIELD2 TABLE.FIELD2%TYPE,
FIELD3 TABLE.FIELD3%TYPE,
FIELD4 TABLE.FIELD4%TYPE
);
BEGIN
PACKAGE.PROCEDURE1(dt_field);
dbms_output.put_line(dt_field);
PACKAGE.PROCEDURE2(dt_field, p_resultset);
LOOP
-- this do not work
FETCH p_resultset INTO p_individual;
EXIT WHEN p_resultset%NOTFOUND;
-- DO STUFF ON EACH RETURNED ROW
END LOOP;
CLOSE p_resultset;
END;
在我的评论之后,您不能在PL/SQL中创建对象类型,您需要声明一个记录类型,然后声明该类型的实例:
DECLARE
type r_individual is record (
FIELD0 DATE,
FIELD1 TABLE1.FIELD1%TYPE,
FIELD2 TABLE1.FIELD2%TYPE,
FIELD3 TABLE1.FIELD3%TYPE,
FIELD4 TABLE1.FIELD4%TYPE
);
p_individual r_individual;
...
您可以将ref游标提取到记录类型中。对象声明上的版本错误,而不是获取
下面是一个基于您的问题的更完整的示例;我没有您的过程,因此我正在创建一个具有相同类型的虚拟结果集,并使用一个虚拟表来声明%TYPE
:
create table table1(dt_field date, field1 number, field2 varchar2(1),
field3 number, field4 varchar2(1));
set serveroutput on
DECLARE
type r_individual is record (
FIELD0 DATE,
FIELD1 TABLE1.FIELD1%TYPE,
FIELD2 TABLE1.FIELD2%TYPE,
FIELD3 TABLE1.FIELD3%TYPE,
FIELD4 TABLE1.FIELD4%TYPE
);
dt_field TABLE1.dt_field%TYPE;
p_resultset SYS_REFCURSOR;
p_individual r_individual;
BEGIN
-- Don't have this package
-- PACKAGE.PROCEDURE1(dt_field);
-- dbms_output.put_line(dt_field);
-- PACKAGE.PROCEDURE2(dt_field, p_resultset);
-- Dummy result set for demo instead
OPEN p_resultset FOR q'[select sysdate, 1, 'A', 3, 'C' from dual]'
|| q'[ union all select sysdate, 2, 'B', 4, 'D' from dual]';
LOOP
FETCH p_resultset INTO p_individual;
EXIT WHEN p_resultset%NOTFOUND;
-- DO STUFF ON EACH RETURNED ROW
DBMS_OUTPUT.PUT_LINE(p_individual.field1
|| ':' || p_individual.field2);
END LOOP;
CLOSE p_resultset;
END;
/
其中包括:
anonymous block completed
1:A
2:B
“我试图在过程中声明一个对象,但它不被允许”,这是您的企业策略的结果?由于缺乏所需的权限?或者它只是产生了某种错误?请看Alex Poole的回答:您需要在PL/SQL中声明一个记录类型,而不是一个对象,然后是该记录类型的一个实例。显示您得到的错误会很有帮助。我不确定您是否可以立即将ref游标提取到记录类型中。谢谢,伙计,这正是我失败的地方。从MySQL\MariaDB迁移是一项巨大的努力。仍在试图找到我的方法。出现:INTO列表中的表达式“P_INDIVIDUAL”是错误的type@delive-出现在哪里?这段代码在SQL*Plus和SQL Developer中运行时没有错误,同样是在11g和12c中。完整的ORA或PLS错误信息是什么?或者您的客户机/IDE本身正在生成它?如果您有一个无法解决的问题,您需要问一个新问题。@Alex Poole错误出现在“将p_结果集提取到p_个人”中;我有多个表,我得到这个错误。例如,在这个代码中有“TABLE1”,我有“TABLE1”,“TABLE2”,“TABLE3”,还有rowtype@delive-那么您还没有调整此选项以正确匹配您的查询。就像我说的,问一个新问题,显示您的表、您的代码版本以及您遇到的问题。