2016-04-20 6 views
-1

Ich habe eine Tabelle wie unten beschriebenORACLE - dynamische SQL- CLOB mit

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

insert_script mit Insert-Anweisung gefüllt wird. Ich möchte das Skript dynamisch einfügen. Ich habe den folgenden Code geschrieben, funktioniert aber nicht.

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; 

My Oracle Version Oracle Database 11g Enterprise Edition Veröffentlichung 11.2.0.4.0 - 64-Bit-Produktion

+4

"* funktioniert nicht *" ist weder eine gültige Oracle-Fehlermeldung noch eine akzeptable Problembeschreibung. –

+0

Könnten Sie den Fehler auch posten? –

Antwort

0

Ich denke, you've mehrere Einfügungen in Ihnen clob-Spalte gespeichert, nicht wahr? Aber EXECUTE IMMEDIATE nur mit einer Operation pro Zyklus funktioniert:

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; 

Im Beispiel oben, alles funktioniert und das Ergebnis wie erwartet:

ID NAME  
1 first 
2 second 

Aber wenn man die dritte EXECUTE-IMMEDIATE Kommentar- , dann wird ein Fehler ausgelöst.

Wenn das Ihr Problem ist, müssen Sie Ihre INPUT-Statements im Semicolon aufteilen und jedes einzeln ausführen.

+0

'Execute Immediate' kann verwendet werden, um mehrere Anweisungen mit' BEGIN' und 'END' auszuführen, siehe oben. –

+0

Meine aufrichtige Entschuldigung .. meine Insert-Anweisung wirft Fehler, wenn in SQL oder dynamischen SQL ausgeführt wird. –

+0

meine Insert-Anweisung ausgeführt in Ordnung, wenn in Toad .. durch ausgeführt wird fehlschlägt, wenn in sqlplus oder pl/sql ausgeführt .. Der Grund dafür ist das Format .. –

1

1.Always eine gute Praxis, die SQL-Abfrage mit dbms_output.put_line zu drucken und die SQL zu überprüfen.

2.In Fall, wenn Sie mehrere insert Aussagen haben, dann können Sie verwenden BEGIN und 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; 

Ausgang:

SQL STMNT - insert into emp(ID,NAME) values(7,'KLM'); 

ERROR LOG