PL / SQL до и после шаблона - PullRequest
0 голосов
/ 09 января 2012

Я хотел бы использовать подход «до и после шаблона» с PL / SQL (PSEUDO CODE):

Метод выкройки:

procedure doIt(DO_SOMETHING)
is
  l_cnt                     pls_integer := 1;
begin
   loop
      begin
        DO_SOMETHING;
        exit;

      exception
        when exception changed then
          if l_cnt = 2 then
            --raise exception...
          else
            l_cnt := l_cnt + 1;
          end if;
       end;
    end loop;
end;  

И выполните это так:

begin
  doIt(execute immediate sql_statement using in or out);
end;

Как видите, я хотел бы использовать разные динамические операторы sql (выполняются немедленно с одной или несколькими переменными in и out), но всегда один и тот же подход перед шаблоном.

У кого-нибудь есть идеи, как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 09 января 2012

Это решение не очень хорошее, но оно работает.Возможно, вы можете начать с этого и сделать что-то лучше:
Я использовал 2 параметра в функции doIt -
1) команду для немедленного выполнения
2) аргументы в виде типа anydata
В выполненииНемедленная команда Я применил всю логику от перевода anydata к некоторому типу, который я создал, чтобы обернуть параметры IN OUT.

вот код:

тип, подобный этому, должен быть создан для каждой отдельной команды:

create or replace type some_type as object(a number, b number);
/

это процедура:

create or replace procedure doIt(aa in varchar2, param IN OUT anydata) is
begin
  execute immediate aa using in out param;
end doIt;
/ 

и вот как я это называю (в этом примере я просто выбрал count (*) из двойного в некоторый параметр OUT):

declare
  i number;
  prm some_type;
  ad anydata;
  a number;
  b number;
begin

  prm := new some_type(a,b);
  ad := anydata.convertobject(prm);

  doIt('declare prmAd anydata := :0; prm1 some_type; x number; begin x := prmAd.getobject(prm1); select count(*) into prm1.a from dual; :0 := anydata.convertobject(prm1); end;', ad);

  i := ad.GetObject(prm);
  dbms_output.put_line(prm.a);
end;

в основном вы можете добавить в процедуру doIt все, что захотите,и запустите с ним любую команду.

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

0 голосов
/ 09 января 2012

Я не могу найти много информации о модели До / После, но, глядя на то, что вы пытаетесь достичь, может выглядеть примерно так:

create or replace
procedure doIt(stmt in varchar2, param in varchar2)
is
  l_cnt pls_integer := 1;
begin
   loop
      begin
        execute immediate stmt using param;
        exit;

      exception
        when others then
          if l_cnt = 2 then
            raise;
          else
            l_cnt := l_cnt + 1;
          end if;
       end;
    end loop;
end;  
/

-- run it 
exec doIt('insert into my_table (col1) values ( :val1 )', 'richard' );

Проблема в том, что если вы хотите передать два параметра, вам придется переопределить 'doIt', например:

procedure doIt(stmt in varchar2, param1 in varchar2, param2 in varchar2)
... 
using param1, param2

Также другая оговорка передает различные типы данных в param. Опять же, вы можете переопределить процедуру с правильным типом данных - имейте в виду, что это может привести к путанице с несколькими типами данных или числом аргументов.

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