Как выбрать определенный пакет на основе определенного значения столбца таблицы в Oracle? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть ситуация:

Нам нужно запустить procedure_1 в пакете, когда в определенном столбце, скажем, столбец X, есть данные и одновременно запустить еще один procedure_2 в пакете, если естьв этом столбце нет данных X

Может кто-нибудь дать совет, что можно сделать с помощью Oracle?

1 Ответ

0 голосов
/ 26 октября 2018

Как-то так?

  • таблица DECIDE содержит PARTICULAR_COLUMN
  • В пакете есть две простые процедуры, которые ничего не делают;они просто идентифицируют себя

.

SQL> create table decide
  2    (id                number,
  3     particular_column varchar2(1));

Table created.

SQL> insert into decide values (1, 'X');

1 row created.

SQL> insert into decide values (2, null);

1 row created.

SQL> create or replace package pkg_decide as
  2    procedure p1;
  3    procedure p2;
  4  end;
  5  /

Package created.

SQL> create or replace package body pkg_decide as
  2    procedure p1 is
  3    begin
  4      dbms_output.put_line('-> running proc 1');
  5    end;
  6
  7    procedure p2 is
  8    begin
  9      dbms_output.put_line('-> running proc 2');
 10    end;
 11  end;
 12  /

Package body created.

SQL>

Проверка: если PARTICULAR_COLUMN не пусто, P1 будет выполняться;в противном случае P2.Это можно сделать с помощью динамического SQL, например EXECUTE IMMEDIATE.Поскольку мы собираемся запустить процедуру, мы должны сформировать полный анонимный блок PL / SQL (начало - имя процедуры - конец).

PS Как предложил Мэтью, простой IF сработает.

SQL> begin
  2    for cur_r in (select particular_column,
  3                         case when particular_column is not null then 'pkg_decide.p1'
  4                             else 'pkg_decide.p2'
  5                         end prc_name
  6                  from decide
  7                 ) loop
  8      dbms_output.put_line('particular column = ' || cur_r.particular_column ||
  9                           ', should run procedure ' || cur_r.prc_name);
 10      execute immediate 'begin ' ||cur_r.prc_name ||'; end;';
 11
 12      -- Or, as suggested by Matthew, a simple IF will do
 13      if cur_r.particular_column is not null then
 14         pkg_decide.p1;
 15      else
 16         pkg_decide.p2;
 17      end if;
 18    end loop;
 19  end;
 20  /
particular column = X, should run procedure pkg_decide.p1
-> running proc 1
-> running proc 1
particular column = , should run procedure pkg_decide.p2
-> running proc 2
-> running proc 2

PL/SQL procedure successfully completed.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...