отображать результаты выбора внутри анонимного блока - PullRequest
8 голосов
/ 23 июня 2011

Я пытаюсь отладить 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 ]

10 голосов
/ 11 июля 2011

Вы можете попробовать это, чтобы легко напечатать ваш результат:

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;
0 голосов
/ 29 сентября 2015

Я недавно перешел с 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;
0 голосов
/ 23 июня 2011

Error

Насколько я знаю, какой бы инструмент вы ни использовали для отладки, блоки pl / sql (анонимные и именованные) должны быть действительными для PL / SQL-компилятора . Дело в том, что ваш блок не является действительным для компилятора PL / SQL, и ваша ошибка готова вам сообщить об этом и выходит из компилятора PL / SQL и не от Sql Developer !

PLS-00428: ожидается предложение INTO в этом утверждении SELECT Причина: предложение INTO оператора SELECT INTO было опущено. За Например, код может выглядеть так ВЫБЕРИТЕ deptno, dname, loc FROM dept ГДЕ ... вместо того чтобы ВЫБРАТЬ детно, dname, loc INTO dept_rec FROM dept ГДЕ ... В PL / SQL только подзапрос написано без предложения INTO. Действие: Добавьте обязательное предложение INTO

и

ORA-06550: строка строки, строка столбца: строка Причина: обычно ошибка компиляции PL / SQL. Действие: нет

Почему ошибка

При появлении ошибки Pl / sql у вас есть выбор для исследования только в коде и в руководствах: Разрешение имен в статических операторах SQL


PS: Маршрут всегда один и тот же:

Как спросить

Все "оракулы" здесь:

Sql Developer

0 голосов
/ 23 июня 2011

Чтобы вернуть значение выбора, необходимо выбрать в контейнер (ссылочный курсор или REF CURSOR).В вашем объявлении вы должны включить ref_cursor_out SYS_REFCURSOR; и изменить свой выбор на:

select * into ref_cursor_out ...

В SQL Developer есть опция (я пользователь Toad, поэтому я забываю, где в SD), которая сообщает IDEзагрузить набор результатов в сетку для просмотра.

[править: за комментарий от @DCookie, спасибо за улов!]

...