10

我正在尝试在过程中调试 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;
4

5 回答 5

11

您可以尝试使用此方法轻松打印结果:

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;
于 2011-07-11T10:56:45.657 回答
1

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

select * into ref_cursor_out ...

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

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

于 2011-06-23T14:26:46.403 回答
1

对于 oracle 12c 或更高版本

declare
    rfc sys_refcursor; 
begin
    open rfc for select * from table;
    dbms_sql.return_result(rfc);
end;
于 2021-03-02T03:27:01.430 回答
0

错误

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

PLS-00428:在这个 SELECT 语句中需要一个 INTO 子句原因:省略了一个 SELECT INTO 语句的 INTO 子句。例如,代码可能看起来像 SELECT deptno, dname, loc FROM dept WHERE ... 而不是 SELECT deptno, dname, loc INTO dept_rec FROM dept WHERE ... 在 PL/SQL 中,只编写没有 INTO 子句的子查询. 行动:添加所需的 INTO 子句

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

为什么会出错

当出现 Pl/sql 错误时,您只能选择在代码手册中进行调查: 静态 SQL 语句中的名称解析


PS: 路线总是一样的:

怎么问

所有的“神谕”都在这里:

Sql 开发人员

于 2011-06-23T15:40:58.200 回答
0

我最近从 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;
于 2015-09-29T12:02:13.543 回答