ORACLE - 使用CLOB的动态Sql

时间:2016-04-20 14:35:36

标签: oracle plsql dynamic-sql clob

我有一张如下所述的表格

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位生产

2 个答案:

答案 0 :(得分:1)

1.最好使用dbms_output.put_line打印SQL查询并验证SQL

2.如果您有多个insert语句,则可以使用BEGINEND

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

ERROR LOG

答案 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并逐个执行。