为何SQL存储过程中无法直接使用INSERT语句,需用EXECUTE IMMEDIATE?
存储过程中直接使用INSERT语句报错,仅EXECUTE IMMEDIATE方式可行
我的存储过程功能是遍历数据库,将其克隆为不同名称,并在当前数据库的表中记录该操作。目前遇到的问题是:使用EXECUTE IMMEDIATE 'INSERT...';的写法可以正常运行,但换成直接编写INSERT语句时,创建存储过程会触发语法错误。
可正常运行的代码片段
IF ( :DB_NAME IS NOT NULL ) THEN DEST_DB_NAME := REGEXP_REPLACE(:DB_NAME, '^' || :ENV_SOURCE, :ENV_DEST); EXECUTE IMMEDIATE 'INSERT INTO CENTRAL.AUDIT.CLONING_HISTORY(SOURCE_ENVIRONMENT, SOURCE_DATABASE, DEST_ENVIRONMENT, DEST_DATABASE, AS_OF_TIMESTAMP, OPERATION) VALUES(?, ?, ?, ?, ?, ''CLONE'')' USING (ENV_SOURCE, DB_NAME, ENV_DEST, DEST_DB_NAME, AS_OF_TIMESTAMP); SQL := 'CREATE DATABASE ' || :DEST_DB_NAME ||' CLONE ' || :DB_NAME || ' AT(TIMESTAMP => \'' || AS_OF_TIMESTAMP::STRING || '\'::TIMESTAMP_NTZ)'; EXECUTE IMMEDIATE SQL;
报错的代码片段(替换为直接INSERT)
尝试将第一个EXECUTE IMMEDIATE替换为直接INSERT语句后,创建存储过程时触发语法错误:
IF ( :DB_NAME IS NOT NULL ) THEN DEST_DB_NAME := REGEXP_REPLACE(:DB_NAME, '^' || :ENV_SOURCE, :ENV_DEST); INSERT INTO AUDIT.CLONING_HISTORY(SOURCE_ENVIRONMENT, SOURCE_DATABASE, DEST_ENVIRONMENT, DEST_DATABASE, AS_OF_TIMESTAMP, OPERATION) VALUES(ENV_SOURCE, DB_NAME, ENV_DEST, DEST_DB_NAME, AS_OF_TIMESTAMP, 'CLONE')'; SQL := 'CREATE DATABASE ' || :DEST_DB_NAME ||' CLONE ' || :DB_NAME || ' AT(TIMESTAMP => \'' || AS_OF_TIMESTAMP::STRING || '\'::TIMESTAMP_NTZ)'; EXECUTE IMMEDIATE SQL;
错误信息
SQL编译错误:
第48行第8位出现语法错误,意外的'DB_NAME'。
第48行第16位出现语法错误,意外的':='。
进一步测试
即使把INSERT语句简化为更简单的形式,依然会触发相同错误:
INSERT INTO Whatever.SomeColumn(33);
内容的提问来源于stack exchange,提问作者Eric Mamet
相关产品推荐
相关产品推荐

