Oracle 在匿名块内显示选择结果

Oracle 在匿名块内显示选择结果,oracle,plsql,oracle10g,oracle-sqldeveloper,pls-00428,Oracle,Plsql,Oracle10g,Oracle Sqldeveloper,Pls 00428,我试图在一个过程中调试一个SELECT,我试图使用一个匿名块来调试它。我希望SQL开发人员只返回最后一条SELECT语句,但我得到了错误: ORA-06550: line 21, column 5: PLS-00428: an INTO clause is expected in this SELECT statement 在这个过程中,我有一个用于该select的INTO,但是有没有一种简单的方法可以简单地获得最后一个select语句的结果以进行调试?我使用匿名块和变量,这样代码就尽可能与过

我试图在一个过程中调试一个SELECT,我试图使用一个匿名块来调试它。我希望SQL开发人员只返回最后一条SELECT语句,但我得到了错误:

ORA-06550: line 21, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement
在这个过程中,我有一个用于该select的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;

为了返回select的值,需要将其选择到一个容器中,即引用光标或REF光标。在声明中,您应该包括ref\u cursor\u out SYS\u REFCURSOR; 并将您的选择更改为:

select * into ref_cursor_out ...
在sqldeveloper中有一个选项,我是Toad用户,所以我忘记了在SD中告诉IDE将结果集加载到网格中进行查看的位置

[编辑:根据@DCookie的评论,谢谢您的帮助!]

错误

据我所知,无论使用什么工具进行调试,pl/sql块sanonymous和named都应该对pl/sql编译器有效。 事实上,您的块对于PL/SQL编译器的结果无效,您的错误就在那里告诉您,它来自PL/SQL编译器,而不是SQL开发人员

PLS-00428:预计会有INTO条款 在此SELECT语句中 原因:SELECT INTO语句的INTO子句被省略。对于 例如,代码可能如下所示 从dept中选择deptno、dname、loc 哪里而不是选择deptno, dname,loc进入部门\从部门接收 哪里在PL/SQL中,只有子查询 没有插入子句。 操作:将required添加到子句中

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

为什么会出错

出现Pl/sql错误时,您只能选择在代码和手册中进行调查:

附言: 路线始终相同:


您可以尝试使用此功能,以便轻松打印结果:

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;

我最近从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;

对于oracle 12c或更高版本

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

如果我添加了一个tblresult REF游标;在开始之前,我得到一个PLS-00201:必须声明标识符“CURSOR”。您的ref\u CURSOR\u out声明应该是ref\u CURSOR\u out SYS\u REFCURSOR;Tks@DCookie。它编译和所有。。。我使用open tblresult来选择*from。我一直在寻找和挖掘。。。如何打印tblresult?100%的样本来自procs。有关匿名块的无..:-/Tks的信息。我意识到了这一切,我花了一个多小时的时间进行搜索,在不创建类型的情况下,我找不到解决问题的简单方法。经过所有的调查,我仍然找不到一个简单的方法来解决这个问题。也许没有简单的方法,这就是答案。我只是不知道,即使在搜索之后。在我的过程中,这项技术非常有效。只需知道如何在匿名块中执行此操作,并将其显示在SQL developer上。此答案可以让您了解: