Определение бинд пременных

stalker_cop
Дата: 22.02.2007 15:08:31
Всем привет.
Как определить и получить все бинд переменные которые присутствуют в sql или pl/sql (это в переменной)
блоке.
Как я понимаю это что-то типа
DECLARE
STRING VARCHAR2(32767);
Components Owa_Text.Vc_Arr;
BEGIN
STRING := 'Select * from d_Article where id = :Article_id and qq = :qq';
IF (Owa_Pattern.Match(STRING, '(\W:\w+)', Components) )
THEN
IF Components.COUNT != 0 THEN
dbms_output.put_line(Components.COUNT);
FOR i IN Components.FIRST .. Components.LAST LOOP
dbms_output.put_line(Components(i));
END LOOP;
END IF;
END IF;
END;

Но данная конструкция выделяет только :Article_id а вторую не ловит
как получить все переменные
работаем с Oracle9.2.0.4.0
Elic
Дата: 22.02.2007 16:02:38
stalker_cop
Но данная конструкция выделяет только :Article_id а вторую не ловит
Чтобы понять, что такое backrefs, используй шаблон
\'((\\W:)(\\w+))\'
stalker_cop
как получить все переменные
amatch в цикле.

P.S. Деготь в алгоритм: STFF Про bind-переменные :)
stalker_cop
Дата: 22.02.2007 16:45:28
с ней aMatch вообще непонятки какие то.
нехера она не находит
почему не знаю


DECLARE
STRING VARCHAR2(32767);
pat VARCHAR2(32767);
Components Owa_Text.Vc_Arr;
i INTEGER;
b BOOLEAN;
BEGIN
STRING := 'Select * from d_Article where id = :Article_id and qq = :qq';
pat := '(\W:\w+)';
i := Owa_Pattern.aMatch(STRING, 1, pat, Components);
dbms_output.put_line(i);
dbms_output.put_line('Components.COUNT '||to_char(Components.COUNT));
b := Owa_Pattern.Match(STRING, pat, Components);
dbms_output.put_line('Components.COUNT '||to_char(Components.COUNT));

END;
Elic
Дата: 22.02.2007 17:19:06
stalker_cop
с ней aMatch вообще непонятки какие то.
нехера она не находит
почему не знаю
Это ты неразобравшийся хрен, а не "она нехера не находит":
declare
  string     varchar2(32767);
  components owa_text.vc_arr;
  i int := 1;
begin
  string := 'select * from d_article where id = :article_id and qq = :qq';
  loop
    i := owa_pattern.amatch(string, i , '[^:]*(:\w+)', components);
    exit when i = 0;
    if components.count != 0 then
      for i in components.first .. components.last loop
        dbms_output.put_line(components(i));
      end loop;
    end if;
  end loop;
end;
/
stalker_cop
Дата: 22.02.2007 18:16:27
Тогда получается что функции amatch и match работают по разному.
Почему одна находит а вторая нет?
Elic
Дата: 22.02.2007 18:24:23
stalker_cop
Тогда получается что функции amatch и match работают по разному.
Почему одна находит а вторая нет?
RTFM pubpat.sql: amatch.from_loc
stalker_cop
Дата: 22.02.2007 18:37:38
с amatch.from_loc = 0
должны быть идентичны
как я понимаю
или я что-то нет так понимаю?
Elic
Дата: 22.02.2007 18:54:59
stalker_cop
или я что-то нет так понимаю?
pubpat.sql
   /* from_loc - Indicates the index of the first character in "line" */
/* to try to match. */
stalker_cop
Дата: 22.02.2007 19:12:08
0 или 1 не важно (я проверял)
прикол заключается если менять маску то результаты могут быть разными.
Elic
Дата: 22.02.2007 19:19:51
stalker_cop
прикол заключается если менять маску то результаты могут быть разными.
Нет приколов. Есть твоё непонимание. RTFM