Блоки PL / SQL - просто увидеть результат?[Очень простой вопрос, я уверен!] - PullRequest
2 голосов
/ 30 августа 2011

Я уверен, что то, что я хочу, очень просто, но я не могу понять, как.

Я хочу:

  • Чтобы объявить некоторые переменные и инициализировать их для определенных значений
  • Чтобы выполнить несколько выборок (основанных на указанных выше значениях переменных) и увидеть результаты, как если бы я выполнил результаты прямо в командной строке sqlplus

Я считаю, что необходимо использоватьструктура блока для того, чтобы я мог объявлять и использовать переменные в предикатах запросов.Хотя примеры, показанные здесь, довольно просты в реальном случае, существует множество, гораздо более сложных SELECT.

Я попытался сделать это (на мгновение забыв о предикатах) ...

DECLARE
    EMP_EMPLOYEE_ID_IN  VARCHAR2(12);
BEGIN
    EXECUTE IMMEDIATE 'SELECT * FROM DEPT WHERE DEPNO';
END;
/

... но когда я это делаю, я выполняю выборку, не видя вывода.

Я тоже пробовал это ...

DECLARE
    EMP_EMPLOYEE_ID_IN  VARCHAR2(12);
BEGIN
    SELECT * FROM DEPT;
END;
/

... но потом яget ...

PLS-00428: в этом операторе SELECT ожидается предложение INTO

... Я действительно не хочу объявлять переменную для каждого столбца, который появитсяв моем выводе.

Может кто-нибудь сказать мне, как я могу выполнить SELECT, но просто и легко увидеть вывод, как если бы я был в командной строке sqlplus, то есть, чтобы увидеть тот же вывод, как если бы я сделал это

SQL> SELECT * FROM DEPT;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

Спасибо



Я проверил ответ Шеннона Северанса ниже и обнаружил, что он будет делать то, что я хочу.

Ради более поздних читателей я подумал, что было бы полезно показать полный сценарий здесь.

set line 32000;
set trimspool on;
var V_CURSOR1 REFCURSOR;
var V_CURSOR2 REFCURSOR;
var V_CURSOR3 REFCURSOR;
DECLARE
    DEPT_NUM_IN     VARCHAR2(12);
BEGIN
    DEPT_NUM_IN :=  '10';
    OPEN :V_CURSOR1 FOR SELECT * FROM DEPT;
    OPEN :V_CURSOR2 FOR SELECT * FROM DEPT ORDER BY LOC;
    OPEN :V_CURSOR3 FOR SELECT * FROM DEPT WHERE DEPTNO = DEPT_NUM_IN ORDER BY LOC;
END;
/
print V_CURSOR1
print V_CURSOR2
print V_CURSOR3

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Из sqlplus другие инструменты могут отличаться.

Сначала объявите переменную-прекурсор sqlplus

SQL> var l_cursor refcursor

Затем откройте этот курсор в блоке PL / SQL, где у вас будет доступ кобъявленные переменные и все:

SQL> edit
Wrote file afiedt.buf

  1  declare
  2      l_number number;
  3  begin
  4      open :l_cursor for select table_name from all_tables where rownum < 10;
  5* end;
SQL> /

PL/SQL procedure successfully completed.

Обратите внимание, что к переменной refcursor добавляется :, это потому, что мы связываем переменную sqlplus с анонимным блоком PL / SQL

Затем используйте команду печати SQLPLUS:

SQL> print l_cursor

TABLE_NAME
------------------------------
ICOL$
CON$
UNDO$
PROXY_ROLE_DATA$
FILE$
UET$
IND$
SEG$
COL$

9 rows selected.
0 голосов
/ 30 августа 2011
DECLARE
  v_result VARCHAR2(400);

BEGIN

  SELECT dummy
    INTO v_result
    FROM dual;

  dbms_output.put_line(v_result);

END;
...