2012-04-04 4 views
0
CREATE OR REPLACE procedure abc 
IS 
TYPE abc is table of varchar2(200); 
v_nt abc; 

BEGIN 

select 'update emp_test set ename=''gaurav'' ' bulk collect into v_nt from emp; 

forall i in v_nt.first..v_nt.last 
execute immediate v_nt(i); 

END; 
/

Hallo, Ich bin das oben beschriebene Verfahren zu schaffen und immer Zeitfehler kompiliert, wie unten dargestellt:Fehler: PLS-00801: interne Fehler [*** ASSERT in Datei pdw4.c

Compilation errors for PROCEDURE SCOTT.ABC

Error: PLS-00801: internal error [*** ASSERT at file pdw4.c, line 586; Unknown expression Expr = 283.; ABC__SCOTT__P__53497[11, 1]] Line: 11 Text: execute immediate v_nt(i);

Wie kann ich dies beheben, wie ich diese Transaktion in loser Schüttung tun muss.

+2

Die Update-Anweisung sieht sehr verdächtig erzielt die unten arbeiten. Es sieht so aus, als ob Sie versuchen, jede Zeile in emp_test mit demselben Ename zu aktualisieren, und Sie möchten dieses Update einmal für jede Zeile in der emp-Tabelle ausführen. Mit anderen Worten, wenn es 10 Emp-Datensätze gibt, werden Sie alle 10 Datensätze, jeweils 10-mal, alle auf den gleichen Wert aktualisieren. –

Antwort

1

sollte

CREATE OR REPLACE procedure abc IS 
    TYPE abc is table of varchar2(200); 
    v_nt abc; 
BEGIN 
    select 'gaurav' bulk collect into v_nt from emp; 
    forall i in v_nt.first .. v_nt.last 
    execute immediate 'update emp_test set ename=:1' using v_nt(i); 
END; 
    /

Obwohl die unten auch das gleiche Ergebnis

CREATE OR REPLACE procedure abc IS 
BEGIN 
    execute immediate 'update emp_test set ename=''gaurav'' '; 
END; 
    /
+0

: das weiß ich, aber aus dem oben genannten wählen, wo ich Bulk collect mache, erstelle ich eine update-Anweisung, deren Spalten und entsprechende Spalten dynamisch bevölkert sind, so ist dies mit dem Ansatz von Ihnen nicht möglich.Anyways Thanks for the answer +1 –

+0

Danke Gaurav, ich habe versucht für eine andere Lösung, aber es scheint, dass wir nicht Sammlung für Tabellenname oder Objektidentifikator für die Aktualisierung in FORALL seit dem unten e: = 'update' || a (1) || 'set' || b (1) || '='; Forall I in 1..2 ausführen sofort e || ': 1' mit c (i); ENDE; funktioniert, aber der folgende Code gibt den gleichen Fehler zurück e (1): = 'update' || a (1) || 'set' || b (1) || '='; e (2): = 'Aktualisieren' || a (2) || 'set' || b (2) || '='; Forall I in 1..2 ausführen sofort e (i) || ': 1' mit c (i); – psaraj12