【问题标题】:display select results inside anonymous block在匿名块内显示选择结果
【发布时间】:2011-09-21 06:49:54
【问题描述】:

我正在尝试在过程中调试 SELECT,并且正在尝试使用匿名块。我希望 SQL Developer 只返回最后一个 SELECT 语句,但我得到了错误:

ORA-06550: line 21, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

在过程中,我有一个用于该选择的 INTO,但有没有一种简单的方法可以简单地获取最后一个 SELECT 语句的结果以进行调试?我正在使用匿名块和变量,以便代码与过程中的实际代码尽可能相似,这样我就不必更改代码

set serveroutput on format wrapped;
DECLARE
  p_cd_doc_type number;
  p_dc_doc_code varchar2(200);
  p_dt_base date;
  p_qt_days number;
  p_vl_mov_total number;
  p_qt_transac number;
  v_dt_max date;
  v_dt_min date;
begin
  p_dt_base := sysdate;
  p_qt_days := 1;

  v_dt_max := trunc(p_dt_base) + 1;
  v_dt_min := v_dt_max - p_qt_days;
  p_vl_mov_total := 0;

  DBMS_OUTPUT.PUT_LINE('v_dt_max = ' || v_dt_max);
  DBMS_OUTPUT.PUT_LINE('v_dt_min = ' || v_dt_min);

    select *
    from tb_cad_cliente a join tb_trn_transacao b
      on a.cd_cliente = b.cd_cliente 
    where a.cd_doc_type = p_cd_doc_type
    and a.dc_doc_code = p_dc_doc_code
    and b.dt_row between v_dt_min and v_dt_max
    and b.cd_status = 3;
end;

【问题讨论】:

    标签: oracle plsql oracle10g oracle-sqldeveloper pls-00428


    【解决方案1】:

    对于 oracle 12c 或更高版本

    declare
        rfc sys_refcursor; 
    begin
        open rfc for select * from table;
        dbms_sql.return_result(rfc);
    end;
    

    【讨论】:

      【解决方案2】:

      我最近从 MSSQL 更改为 PLSQL,但出于分析目的,我错过了作为过程表的返回值。我简单地编写了通过两个步骤返回表的动态查询。也许有人使用它:

      /* 
      rkry20150929: Return table from anonymous block 
      */
      declare
      v_stmt varchar2(1000);
      c int;
      BEGIN
       select count(*) into c from user_tables where table_name = upper('tmp_result');
       if c>0
       THEN 
        v_stmt := 'truncate table tmp_result';
        execute immediate v_stmt; 
        v_stmt := 'drop table tmp_result';
        execute immediate v_stmt; 
       end if;
       v_stmt :='CREATE GLOBAL TEMPORARY TABLE tmp_result on commit preserve rows AS ';
       v_stmt:= v_stmt || 
       /*-----THERE FILL SQL COMMAND-----------*/'
       SELECT ''Result select to table in anonymous block '' MyColumn FROM DUAL
       ';/*-----THERE FILL SQL COMMAND-----------*/
       execute immediate v_stmt;
       End;
       /*FIRST EXECUTE TO HERE */
      SELECT * FROM tmp_result;
      

      【讨论】:

        【解决方案3】:

        为了返回选择的值,需要将它选择到一个容器(引用光标或REF CURSOR)。在你的声明中你应该包括ref_cursor_out SYS_REFCURSOR; 并将您的选择更改为:

        select * into ref_cursor_out ...
        

        在 SQL Developer 中有一个选项(我是 Toad 用户,所以我忘记了 SD 中的位置),它告诉 IDE 将结果集加载到网格中以进行查看。

        [编辑:@DCookie 的每条评论,感谢您的关注!]

        【讨论】:

        • 如果我添加一个 tblresult REF CURSOR;在开始之前,我得到一个 PLS-00201:必须声明标识符 'CURSOR'
        • 您的 ref_cursor_out 声明应为“ref_cursor_out SYS_REFCURSOR;”
        • 感谢@DCookie。它编译和所有...我使用 open tblresult 选择 * from (...) 。我一直在搜索和挖掘......如何打印 tblresult? 100% 的样本是 procs 的结果。 NONE 关于匿名块.. :-/
        【解决方案4】:

        你可以试试这个,轻松打印你的结果:

        declare
        your_variable varchar2(19);
        BEGIN
        DBMS_OUTPUT.PUT_LINE('init..');
         FOR x IN (SELECT      your_column
                         FROM you_table
                         where rownum<2
                     order by 1)
           LOOP
              DBMS_OUTPUT.PUT_LINE(x.your_column);
           END LOOP;
        END;
        

        【讨论】:

          【解决方案5】:

          错误

          据我所知,无论您使用什么工具进行调试,pl/sql 块(匿名和命名)对于 PL/SQL 编译器都应该是有效的。 事实是您的块对 PL/SQL 编译器无效,您的 error 会告诉您,并且是从 PL/SQL 编译器不是来自Sql Developer

          PLS-00428:需要一个 INTO 子句 在这个 SELECT 语句中 原因:SELECT INTO 语句的 INTO 子句被省略。为了 例如,代码可能看起来像 从部门选择部门号、名称、位置 WHERE ... 而不是 SELECT deptno, dname, loc INTO dept_rec FROM dept WHERE ... 在 PL/SQL 中,只有一个子查询 是在没有 INTO 子句的情况下编写的。 行动:添加所需的INTO子句

          ORA-06550:行字符串,列字符串: 细绳 原因:通常是 PL/SQL 编译错误。 行动:无

          为什么会出错

          当出现 Pl/sql 错误时,您只能选择在代码手册中进行调查: Resolution of names in static SQL statements


          PS: 路线总是一样的:

          How to ask

          All the "oracles" are here:

          Sql Developer

          【讨论】:

          • 感谢信息。我知道这一切,并且我进行了一个多小时的搜索,但我找不到一个简单的方法来解决我的问题而不创建类型。经过所有的调查,我仍然找不到解决这个问题的简单方法。也许没有简单的方法,这就是答案。我根本不知道,即使在搜索之后。 INTO 在我的过程中效果很好。只需要知道如何在匿名块中进行,并在 SQL Developer 上显示
          • 这个答案可以给你一个思路:stackoverflow.com/questions/6265160/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-28
          • 1970-01-01
          • 2017-12-21
          • 1970-01-01
          • 1970-01-01
          • 2019-11-17
          • 1970-01-01
          相关资源
          最近更新 更多