Как вызвать хранимую процедуру для открытия курсоров ссылок с разными запросами - PullRequest
0 голосов
/ 12 мая 2019

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

Я выполнил поиск по переполнению стека, Google и моей книге plsql от Джоан Кастил, но большинство найденных мной блоков возвращают запросы только из одной таблицы. Я получил анонимный блок для выполнения с аналогичной процедурой, если он не запрашивает несколько таблиц, и мой блок anon запускался только тогда, когда он возвращал одну переменную, а не таблицу из нескольких столбцов.

Это код из документа оракула:

CREATE PACKAGE admin_data AS
   TYPE gencurtyp IS REF CURSOR;
   PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT);
END admin_data;
/
CREATE PACKAGE BODY admin_data AS
  PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT) IS
  BEGIN
  IF choice = 1 THEN
     OPEN generic_cv FOR SELECT * FROM employees;
  ELSIF choice = 2 THEN
     OPEN generic_cv FOR SELECT * FROM departments;
  ELSIF choice = 3 THEN
     OPEN generic_cv FOR SELECT * FROM jobs;
  END IF;
END;

END admin_data; /

Я бы опубликовал свое домашнее задание, но я думаю, что лучше понять пример и попытаться применить его. Как бы вы написали анонимный блок?

1 Ответ

0 голосов
/ 13 мая 2019

Я не уверен, почему вы так сосредоточены на анонимном блоке;хотя это может быть сделано таким образом, ваше назначение говорит использовать хранимую процедуру (которая, я полагаю, также может быть функцией);более того, процедура имеет больше смысла.

В любом случае, вот пример SQL * Plus, который показывает, как это сделать:

SQL> set pagesize 100
SQL> set verify off
SQL>
SQL> var choice number;
SQL> var rc refcursor;
SQL>
SQL> begin
  2    if &&choice = 1 then
  3       open :rc for select * from dept;
  4    elsif &&choice = 2 then
  5       open :rc for select * From bonus;
  6    elsif &&choice = 3 then
  7       open :rc for select d.dname, e.ename, e.job
  8                    from dept d join emp e on e.deptno = d.deptno;
  9    end if;
 10  end;
 11  /
Enter value for choice: 2

PL/SQL procedure successfully completed.

SQL> print :rc

ENAME      JOB              SAL       COMM
---------- --------- ---------- ----------
KING       PRESIDENT       1000        100

SQL> undefine choice
SQL> /
Enter value for choice: 3

PL/SQL procedure successfully completed.

SQL> print :rc

DNAME                ENAME      JOB
-------------------- ---------- ---------
ACCOUNTING           CLARK      MANAGER
ACCOUNTING           KING       PRESIDENT
ACCOUNTING           MILLER     CLERK
RESEARCH             JONES      MANAGER
RESEARCH             FORD       ANALYST
RESEARCH             ADAMS      CLERK
RESEARCH             SMITH      CLERK
RESEARCH             SCOTT      ANALYST
SALES                WARD       SALESMAN
SALES                TURNER     SALESMAN
SALES                ALLEN      SALESMAN
SALES                JAMES      CLERK
SALES                BLAKE      MANAGER
SALES                MARTIN     SALESMAN

14 rows selected.

SQL>

Опция, использующая функцию, выглядит следующим образом;как видите, он почти такой же, как и в предыдущем примере.

SQL> create or replace function f_test (par_choice in number)
  2    return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    if par_choice = 1 then
  7       open rc for select * from dept;
  8    elsif par_choice = 2 then
  9       open rc for select * From bonus;
 10    elsif par_choice = 3 then
 11       open rc for select d.dname, e.ename, e.job
 12                    from dept d join emp e on e.deptno = d.deptno;
 13    end if;
 14
 15    return rc;
 16  end;
 17  /

Function created.

SQL> select f_test(2) from dual;

F_TEST(2)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ENAME      JOB              SAL       COMM
---------- --------- ---------- ----------
KING       PRESIDENT       1000        100


SQL> select f_test(1) from dual;

F_TEST(1)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

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


SQL>
...