2016-04-20 45 views
-1

動態SQL我有一個表下方ORACLE - 使用CLOB

SQL> desc tab_script 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
SRLNO            NUMBER 
INSERT_SCRIPT          CLOB 

insert_script與INSERT語句填充描述。我想動態地執行插入腳本。我寫了下面的代碼,但不起作用。

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數據庫11g企業版發佈11.2.0.4.0 - 64位生產

+4

「*不起作用*」既不是有效的Oracle錯誤消息,也不是可接受的問題描述。 –

+0

你是否可以發佈錯誤呢? –

回答

0

我想,......你存儲在你CLOB列多個插件,對不對? 但EXECUTE IMMEDIATE只適用於每個週期操作:

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; 

在上面的示例,一切工作正常,並達到預期的結果:

ID NAME  
1 first 
2 second 

但是,如果你取消註釋第三EXECUTE近前,那麼就會拋出一個錯誤。

如果這是你的問題,你必須在semcicolon中分割你的INPUT-Statements並且每個執行每個。

+0

'Execute immediate'可以用來使用'BEGIN'和'END'來執行多個語句,參見上面的例子。 –

+0

我真誠的歉意..我的插入語句在SQL或動態SQL中執行時拋出錯誤。 –

+0

我的插入語句在蟾蜍中執行時執行得很好..在sqlplus或pl/sql中執行時失敗。原因是格式.. –

1

1.總是使用dbms_output.put_line來打印SQL查詢並驗證SQL

2.In情況下,如果你有多個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