如何从Oracle SQL Developer中的查询窗口返回一组结果?

时间:2015-12-29 22:55:04

标签: oracle oracle-sqldeveloper

对于此代码:

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)。 *操作:更改数据,如何操作或如何声明数据            这些值不违反约束。 现在我收到了这个错误:

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;