varchar в немедленном выполнении

Я использую следующий скрипт pl/sql:

EXECUTE IMMEDIATE 'insert into TAB1(ID, CODE, TYPE, ORDRE) 
    select ''KEY'', ''KEY_LIB'', ''TYP_KEY'', 3 FROM dual
    where not exists(
                    select ID,CODE,TYPE,ORDRE
                    FROM TAB1
                    where TYPE=''TYP_KEY''
                    AND CODE =''KEY_LIB''
                    )';

И я получаю следующую ошибку:

  1. 00000 - "Ключевое слово FROM не найдено там, где ожидалось"

Ошибка кажется во второй строке, но я не могу понять, что не так. Кто-нибудь может помочь, пожалуйста?


person jane Doe    schedule 03.12.2018    source источник
comment
Сгенерированный код в порядке и работает для меня (совет: отобразите динамическую строку с помощью dbms_output и протестируйте ее в командной строке). Похоже, ошибка где-то еще в вашем коде.   -  person William Robertson    schedule 03.12.2018
comment
Это не делает то, что вы думаете: not exists (select id,code,type,ordre from ...) - оператору существования все равно, что вы выбираете. Кроме того, вы можете опустить select from dual, выбрав непосредственно из TAB1 (с дополнительным предикатом rownum=1).   -  person Jeffrey Kemp    schedule 04.12.2018


Ответы (3)


Тип — это ключевое слово в Oracle. Итак, попробуйте с tablename.Type, когда тип является именем столбца. Вот ваш пересмотренный запрос:

EXECUTE IMMEDIATE 'insert into TAB1(ID, CODE, TYPE, ORDRE) 
select ''KEY'', ''KEY_LIB'', ''TYP_KEY'', 3 FROM dual
where not exists(
                select ID,CODE,TYPE,ORDRE
                FROM TAB1
                where TAB1.TYPE=''TYP_KEY''
                AND CODE =''KEY_LIB''
                )';
person Yasir Arafat    schedule 03.12.2018

Вам лучше попробовать это так:

EXECUTE IMMEDIATE 'insert into TAB1(ID, CODE, "TYPE", ORDRE) 
select :KEY, :KEY_LIB, :TYP_KEY, 3 FROM dual
where not exists(
                select ID,CODE,"TYPE",ORDRE
                FROM TAB1
                where "TYPE" = :TYP_KEY
                AND CODE = :KEY_LIB
                )'
USING 'KEY', 'KEY_LIB', 'TYP_KEY', 'TYP_KEY', 'KEY_LIB';
person Wernfried Domscheit    schedule 03.12.2018
comment
Если вы процитируете TYPE в списке столбцов, вам также нужно будет процитировать его в предложении WHERE, я думаю - person a_horse_with_no_name; 03.12.2018

Вы можете использовать альтернативный механизм цитирования (''Q'') для строковых литералов, то вам не нужны двойные кавычки. С помощью этой техники гораздо проще тестировать запросы вручную (если это необходимо). Кстати, ваш запрос работает нормально.

BEGIN

  EXECUTE IMMEDIATE 
     q'[INSERT INTO tab1(id, code, type, ordre) 
        SELECT 'KEY', 'KEY_LIB', 'TYP_KEY', 3 
          FROM dual
         WHERE NOT EXISTS(
                  SELECT 1
                    FROM tab1
                   where tab1.type = 'TYP_KEY'
                     AND code      = 'KEY_LIB'
               )]';
END;
/
person RGruca    schedule 03.12.2018