在匿名块内显示选择结果

发布于 2024-11-16 20:48:10 字数 1064 浏览 2 评论 0原文

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

I'm trying to debug a SELECT inside a procedure, and I'm trying to this using a anonymous block. I would like that SQL Developer simply return the last SELECT statement, but I get the error:

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

Inside the procedure, I have an INTO for that select, but is there a simple way that I can simply get the results for the last SELECT statement for my debugging? I'm using anonymous block and variables so that the code is as similar as possible from what's actually inside the procedure, so that I don't have to change the code

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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

琉璃繁缕 2024-11-23 20:48:10

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

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;

You can try with this, to print your result easily:

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;
十秒萌定你 2024-11-23 20:48:10

适用于 Oracle 12c 或更高版本

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

For oracle 12c or higher

declare
    rfc sys_refcursor; 
begin
    open rfc for select * from table;
    dbms_sql.return_result(rfc);
end;
人间不值得 2024-11-23 20:48:10

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

select * into ref_cursor_out ...

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

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

In order to return the value of the select it needs to be selected into a container (a reference cursor or REF CURSOR). In your Declare you should include ref_cursor_out SYS_REFCURSOR;
and change your select to:

select * into ref_cursor_out ...

In SQL Developer there is an option (I am a Toad user, so I forget where in SD) that tells the IDE to load the result set into a grid to view.

[edit: per comment from @DCookie, Thanks for the catch!]

溺深海 2024-11-23 20:48:10

错误

据我所知,无论您使用什么工具来调试,pl/sql 块(匿名和命名)对于PL/SQL 编译器<应该是有效 /强>。
事实上,您的块对于 PL/SQL 编译器来说无效,并且您的错误会告诉您,并且是从 PL/SQL 编译器中输出的> 并且不是来自Sql Developer

PLS-00428:需要 INTO 子句
在此 SELECT 语句中
原因:省略了 SELECT INTO 语句的 INTO 子句。为了
例如,代码可能如下所示
从部门中选择部门号、dname、loc
WHERE ...而不是 SELECT deptno,
dname,loc INTO dept_rec FROM dept
WHERE ... 在 PL/SQL 中,只有子查询
编写时不带 INTO 子句。
操作:添加所需的 INTO 子句

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

为什么错误

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


PS:
路线始终相同:

如何提问

所有“预言机”都在这里:

<一个href="http://download.oracle.com/docs/cd/E11882_01/doc.112/e12152/toc.htm" rel="nofollow">Sql 开发人员

Error

For what I know, whatever tool you use to debug, the pl/sql blocks(anonymous and named) should be valid for the PL/SQL compiler.
The fact is that your block doesn't result valid for the PL/SQL compiler, and your error is there to tell you, and is coming out from the PL/SQL compiler and not from the Sql Developer!

PLS-00428: an INTO clause is expected
in this SELECT statement
Cause: The INTO clause of a SELECT INTO statement was omitted. For
example, the code might look like
SELECT deptno, dname, loc FROM dept
WHERE ... instead of SELECT deptno,
dname, loc INTO dept_rec FROM dept
WHERE ... In PL/SQL, only a subquery
is written without an INTO clause.
Action: Add the required INTO clause

and

ORA-06550: line string, column string:
string
Cause: Usually a PL/SQL compilation error.
Action: None

Why error

When an Pl/sql error appear, you only have the choice to investigate in the code and in the manuals:
Resolution of names in static SQL statements


PS:
The route is always the same:

How to ask

All the "oracles" are here:

Sql Developer

停滞 2024-11-23 20:48:10

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

I recently changed from MSSQL to PLSQL and I miss the return values as tables from procedures for analytical purposes. I wrote simply dynamic query that return table by two steps. Maybe someone use it:

/* 
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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文