оракул pl / sql ошибка ora-01722 - PullRequest
0 голосов
/ 09 июня 2009

В моей процедуре есть простое утверждение оракула:

update org.security_training_question a 
set a.actv_indr = 'N' where a.qstn_id in (v_qstns_to_delete);

v_qstns_to_delete - передаваемый параметр. Это поле varchar2, а a.qstn_id - числовое поле.

При вызове хранимой процедуры для v_qstns_to_delete я передаю следующую строку: «24, 43, 23, 44, 21».

Когда я запускаю оператор, выводим хранимую процедуру, тогда она работает нормально, но когда я запускаю ее как хранимую процедуру, в строке выше я получаю сообщение об ошибке «Неверное число».

Любая подсказка?

Ответы [ 2 ]

2 голосов
/ 09 июня 2009

Вы не можете использовать предложение "in" с такой переменной. Один из способов обойти это

declare stmt varchar2(4000);
begin
  stmt := 'update org.security_training_question a set a.actv_indr = ''N'' where a.qstn_id in ('||v_qstns_to_delete||')';
  execute immediate stmt;
end;
1 голос
/ 09 июня 2009

если v_qstns_to_delete - это varchar, вам нужно будет немного его преобразовать, чтобы Oracle понял, что в нем может быть несколько элементов. Одним из методов будет преобразование строки в таблицу элементов.

Предположим, qstn_id - это столбец NUMBER. Вы бы:

SQL> CREATE TYPE tab_number AS TABLE OF NUMBER;
  2  /

Type created

SQL> CREATE OR REPLACE FUNCTION to_tab_number(p_in VARCHAR2,
  2                                           p_separator VARCHAR2 DEFAULT ',')
  3        RETURN tab_number AS
  4     l_result tab_number := tab_number();
  5     l_tail   LONG := p_in;
  6  BEGIN
  7     WHILE l_tail IS NOT NULL LOOP
  8        l_result.EXTEND;
  9        IF instr(l_tail, p_separator) != 0 THEN
 10           l_result(l_result.COUNT) := to_number(substr(l_tail,
 11                                                 1,
 12                                                 instr(l_tail, p_separator) - 1));
 13           l_tail := substr(l_tail, instr(l_tail, p_separator) + 1);
 14        ELSE
 15           l_result(l_result.COUNT) := to_number(l_tail);
 16           l_tail := NULL;
 17        END IF;
 18     END LOOP;
 19     RETURN l_result;
 20  END;
 21  /

Function created

Затем можно преобразовать строку в таблицу чисел из SQL:

SQL> SELECT * FROM TABLE(to_tab_number('24, 43, 23, 44, 21'));

COLUMN_VALUE
------------
          24
          43
          23
          44
          21

Чтобы сделать переменную в списке:

SQL> SELECT object_id, owner
  2    FROM all_objects
  3   WHERE object_id IN (SELECT column_value FROM TABLE(to_tab_number('18,19,20')));

 OBJECT_ID OWNER
---------- ------------------------------
        18 SYS
        19 SYS
        20 SYS

Больше на ту же тему на askTom .

...