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

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

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

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

1 ответ

Что-то вроде этого?

  • Таблица 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>
Другие вопросы по тегам