对于此代码:
DECLARE
v_APPL_ID NUMBER(10,0) := 0;
v_ADMIN_PHS_ORG_CODE VARCHAR2(2 BYTE) := ' ';
v_SERIAL_NUM NUMBER(6,0) := 0;
v_Proj_Appl_Rec Proj_Appl_Rec;
v_Proj_Appl_Tab Proj_Appl_Tab := Proj_Appl_Tab();
v_Proj_Appl_Cur SYS_REFCURSOR;
v_cnt NUMBER := 0;
GrantApplications_CUR SYS_REFCURSOR;
BEGIN
ireport_portfolios.GetPortfolioAppsAndProjects(
null, 190, 'DYNAMIC', null, v_Proj_Appl_Cur);
--dbms_output.put_line('appl_id' || chr(9) || 'ic' || chr(9) || 'serial_num');
LOOP
FETCH v_Proj_Appl_Cur
INTO v_APPL_ID, v_ADMIN_PHS_ORG_CODE, v_SERIAL_NUM;
EXIT WHEN v_Proj_Appl_Cur%NOTFOUND;
v_Proj_Appl_Tab.extend;
v_cnt := v_cnt + 1;
v_Proj_Appl_Tab(v_cnt) := Proj_Appl_Rec(v_APPL_ID, v_ADMIN_PHS_ORG_CODE, v_SERIAL_NUM);
--dbms_output.put_line( v_APPL_ID || chr(9) || v_ADMIN_PHS_ORG_CODE || chr(9) || v_SERIAL_NUM);
END LOOP;
CLOSE v_Proj_Appl_Cur;
OPEN GrantApplications_CUR FOR
WITH Appls_CTE
AS
(
SELECT DISTINCT
pa.Appl_Id
FROM TABLE(v_proj_appl_tab) pa
)
SELECT ga.appl_id, council_meeting_date
FROM Appls_CTE ac
JOIN grant_appls ga
ON ac.appl_id = ga.appl_id;
RETURN GrantApplications_CUR;
END;
如果我在底部注释掉RETURN语句,它运行正常。 但我所看到的只是: 匿名块完成。 所以我添加了Return语句,现在我得到了:
错误报告 - ORA-06550:第41行,第9栏: PLS-00372:在过程中,RETURN语句不能包含表达式 ORA-06550:第41行,第9栏: PL / SQL:语句被忽略 06550. 00000 - "行%s,列%s:\ n%s" *原因:通常是PL / SQL编译错误。 *操作:
我尝试取出CTE并加入" TABLE(v_proj_appl_tab)pa"。 但是我得到了同样的错误。
能够看到结果的最后一步是什么? 如何从简单的查询窗口返回这样的结果而无需编写Package PROC?
我尝试从下面的提示中运行此操作: DBMS_SQL.RETURN_RESULT(GrantApplications_CUR);
现在我收到了这个错误:
错误报告 - ORA-06502:PL / SQL:数值或值错误 ORA-06512:在" LINK_OD_IREPORT.IREPORT_PORTFOLIOS",第217行 ORA-06512:at" LINK_OD_IREPORT.IREPORT_PORTFOLIOS",第83行 ORA-06512:第12行 06502. 00000 - " PL / SQL:数字或值错误%s" *原因:算术,数字,字符串,转换或约束错误 发生了。例如,如果尝试,则会发生此错误 将值NULL赋给声明为NOT NULL的变量,或者如果是 尝试将大于99的整数分配给变量 声明NUMBER(2)。 *操作:更改数据,如何操作或如何声明数据 这些值不违反约束。 现在我收到了这个错误:
答案 0 :(得分:1)
在12c中,他们通过DBMS_SQL.RETURN_RESULT添加了对PL / SQL的隐式语句结果的支持。
declare
l_cursor_1 SYS_REFCURSOR;
BEGIN
OPEN l_cursor_1 FOR
SELECT table_name
FROM user_tables
WHERE rownum < 5;
DBMS_SQL.RETURN_RESULT(l_cursor_1);
END;
/
答案 1 :(得分:0)
我终于明白了。我猜测只返回结果并观察它们填充网格很好,就像在SQL Server中一样。 您总是需要遍历光标才能显示结果。
所以基本上我在这里调用Package Proc来填充我的第一个光标并根据第一个光标的RECORD TYPE填充表TYPE。
现在我定义了第二个游标,并使用Common Table Expressions将另一个表连接到第二个游标中。
现在我必须遍历第二个游标并使用dbms_output.put_line结果。
我在这里真正要做的是将Appls_CTE从GetPortfolioApplsAndProjects返回并将其连接到我们数据库中的另一个表来调试我们的一些数据。
现在我想我已经知道我可以自由地将Appls_CTE加入到任何地方并开始调试,就像在我们的数据中查找空值一样。
以下是最终版本:
DECLARE
v_APPL_ID NUMBER(10,0) := 0;
v_ADMIN_PHS_ORG_CODE VARCHAR2(2 BYTE) := ' ';
v_SERIAL_NUM NUMBER(6,0) := 0;
v_Proj_Appl_Rec Proj_Appl_Rec;
v_Proj_Appl_Tab Proj_Appl_Tab := Proj_Appl_Tab();
v_Proj_Appl_Cur SYS_REFCURSOR;
v_cnt NUMBER := 0;
GrantApplications_CUR SYS_REFCURSOR;
fbp_appl_id NUMBER(10,0);
fbp_council VARCHAR2(6 BYTE);
BEGIN
ireport_portfolios.GetPortfolioAppsAndProjects(
null, 190, 'DYNAMIC', null, v_Proj_Appl_Cur);
dbms_output.put_line('appl_id' || chr(9) || 'ic' || chr(9) || 'serial_num');
LOOP
FETCH v_Proj_Appl_Cur
INTO v_APPL_ID, v_ADMIN_PHS_ORG_CODE, v_SERIAL_NUM;
EXIT WHEN v_Proj_Appl_Cur%NOTFOUND;
v_Proj_Appl_Tab.extend;
v_cnt := v_cnt + 1;
v_Proj_Appl_Tab(v_cnt) := Proj_Appl_Rec(v_APPL_ID, v_ADMIN_PHS_ORG_CODE, v_SERIAL_NUM);
--dbms_output.put_line( v_APPL_ID || ' - ' || v_ADMIN_PHS_ORG_CODE || ' - ' || v_SERIAL_NUM);
END LOOP;
CLOSE v_Proj_Appl_Cur;
OPEN GrantApplications_CUR FOR
WITH Appls_CTE
AS
(
SELECT DISTINCT
pa.Appl_Id
FROM TABLE(v_proj_appl_tab) pa
)
SELECT ga.appl_id,
council_meeting_date
FROM Appls_CTE ac
JOIN grant_appls ga
ON ac.appl_id = ga.appl_id;
--RETURN GrantApplications_CUR;
--DBMS_SQL.RETURN_RESULT(GrantApplications_CUR);
LOOP
FETCH GrantApplications_CUR
INTO fbp_appl_id, fbp_council;
EXIT WHEN GrantApplications_CUR%NOTFOUND;
dbms_output.put_line(fbp_appl_id || ' - ' || fbp_council);
END LOOP;
CLOSE GrantApplications_CUR;
END;