我有一张如下所述的表格
SQL> desc tab_script
Name Null? Type
----------------------------------------- -------- ----------------------------
SRLNO NUMBER
INSERT_SCRIPT CLOB
使用insert语句填充insert_script。我想动态执行插入脚本。我写了以下代码,但不起作用。
DECLARE
ln_type_id NUMBER:= 1;
lcl_sql clob;
BEGIN
FOR rec IN ( SELECT * FROM tab_script )
LOOP
lcl_sql:= rec.insert_script;
EXECUTE IMMEDIATE lcl_sql ;
END LOOP;
COMMIT;
END;
我的oracle版本 Oracle Database 11g企业版11.2.0.4.0版 - 64位生产
答案 0 :(得分:1)
1.最好使用dbms_output.put_line
打印SQL查询并验证SQL
。
2.如果您有多个insert
语句,则可以使用BEGIN
和END
DECLARE
v_sql CLOB;
BEGIN
For i in (select * from tab_script)
LOOP
v_sql:= i.insert_script ;
-- Use below line ony if you have multiple insert statements seperated with semi-column
--v_sql := ' BEGIN ' || v_sql || ' END; ' ;
dbms_output.put_line('SQL STMNT - ' || v_sql); -- This is to check SQL
execute immediate v_sql ;
commit;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
--dbms_output.put_line('' );
--Calling procedure to log/insert the exceptions, if any
LOG_PROC_ERRORS('Error with statement : ' || v_sql ||
' ' || ' Error message : ' || ' ' || sqlerrm || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE );
END;
<强>输出:强>
SQL STMNT - insert into emp(ID,NAME) values(7,'KLM');
答案 1 :(得分:0)
我想,你已经在你的clob-column中存储了多个INSERT,对吧? 但EXECUTE IMMEDIATE仅适用于每个周期一次操作:
private $_scopes = array('basic', 'likes', 'comments', 'relationships');
在上面的示例中,一切正常,结果如预期:
CREATE TABLE TEST(ID INTEGER, NAME VARCHAR2(50));
BEGIN
EXECUTE IMMEDIATE 'insert into test (id, name) values (1, ''first'')';
EXECUTE IMMEDIATE 'insert into test (id, name) values (2, ''second'')';
-- EXECUTE IMMEDIATE 'insert into test (id, name) values (3, ''third'');insert into test (id, name) values (4, ''fourth'');';
COMMIT;
END;
/
SELECT * FROM TEST;
DROP TABLE TEST;
但如果取消注释第三个EXECUTE-IMMEDIATE,则会抛出错误。
如果这是您的问题,您必须在semcicolon中拆分INPUT-Statements并逐个执行。