我正在尝试在一个过程中调试一个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;
答案 0 :(得分: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;
答案 1 :(得分:1)
对于 oracle 12c 或更高版本
declare
rfc sys_refcursor;
begin
open rfc for select * from table;
dbms_sql.return_result(rfc);
end;
答案 2 :(得分:0)
为了返回select的值,需要选择一个容器(引用游标或REF CURSOR)。在您的声明中,您应该包含ref_cursor_out SYS_REFCURSOR;
并将您的选择更改为:
select * into ref_cursor_out ...
在SQL Developer中有一个选项(我是Toad用户,所以我忘记在SD中的位置)告诉IDE将结果集加载到网格中进行查看。
[编辑:来自@DCookie的评论,谢谢你们!]
答案 3 :(得分:0)
错误强>
据我所知,无论您使用哪种工具进行调试,对于 PL / SQL编译器,pl / sql块(匿名和命名)应有效。 事实是你的块对PL / SQL编译器没有效果,你的错误告诉你,并且来自 PL / SQL编译器 Sql Developer !
中的不PLS-00428:预计会有INTO条款 在这个SELECT语句中 原因:省略了SELECT INTO语句的INTO子句。对于 例如,代码可能看起来像 SELECT deptno,dname,loc FROM dept 在哪里...而不是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 强>
<强> Sql Developer 强>
答案 4 :(得分: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;