varchar in execute immediate

问题描述 投票:0回答:3

我正在使用以下脚本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关键字

错误似乎在第二行,但我无法弄清楚什么是错的。有人可以帮忙吗?

oracle plsql execute-immediate
3个回答
0
投票

Type是Oracle中的关键字。因此,当type是列名时,请尝试使用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''
                )';

0
投票

你最好这样试试:

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';

0
投票

你可以使用Alternative Quoting Mechanism (''Q'') for String Literals,那么你不需要双引号。使用这种技术,手动测试查询(如果需要)更容易。顺便说一句,你的查询工作正常。

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;
/
© www.soinside.com 2019 - 2024. All rights reserved.