Отображать результаты выбора внутри анонимного блока
Я пытаюсь отладить 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;
5 ответов
Вы можете попробовать это, чтобы напечатать ваш результат легко:
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;
Для оракула 12c или выше
declare
rfc sys_refcursor;
begin
open rfc for select * from table;
dbms_sql.return_result(rfc);
end;
Чтобы вернуть значение выбора, его нужно выбрать в контейнер (курсор ссылки или REF CURSOR). В вашем объявлении вы должны включить ref_cursor_out SYS_REFCURSOR;
и измените свой выбор на:
select * into ref_cursor_out ...
В SQL Developer есть опция (я - пользователь Toad, поэтому я забыла, где в SD), которая сообщает IDE о загрузке результирующего набора в сетку для просмотра.
[edit: за комментарий от @DCookie, спасибо за улов!]
Недавно я перешел с 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;
ошибка
Насколько я знаю, какой бы инструмент вы ни использовали для отладки, блоки pl/sql (анонимные и именованные) должны быть действительны для компилятора PL/SQL. Дело в том, что ваш блок не является действительным для компилятора PL/SQL, и ваша ошибка должна сообщить вам, и он исходит от компилятора PL/SQL, а не от разработчика Sql!
PLS-00428: в этом операторе SELECT ожидается предложение INTO Причина: предложение INTO в инструкции SELECT 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: маршрут всегда один и тот же: