Warum wird EXECUTE IMMEDIATE hier benötigt?

Ich bin ein SQL Server-Benutzer und habe ein kleines Projekt mit Oracle zu erledigen. Daher versuche ich, einige der Besonderheiten von Oracle zu verstehen, und ich gehe davon aus, dass ich Hilfe benötige, um die folgende Situation besser zu verstehen:

Ich möchte testen, ob eine temporäre Tabelle vorhanden ist, bevor ich sie erstelle. Daher hatte ich diesen Code hier:

DECLARE
  table_count INTEGER;
  var_sql VARCHAR2(1000) := 'create GLOBAL TEMPORARY table TEST (
            hello varchar(1000) NOT NULL)';
BEGIN
  SELECT COUNT(*) INTO table_count FROM all_tables WHERE table_name = 'TEST';

  IF table_count = 0 THEN
    EXECUTE IMMEDIATE var_sql;
  END IF;
END;

Es funktioniert normal. Nachdem ich es einmal ausgeführt habe, habe ich eine else-Anweisung zu meiner IF hinzugefügt:

ELSE
  insert into test (hello) values ('hi');

Ausgeführt es erneut und eine Zeile wurde zu meiner Testtabelle hinzugefügt.

Ok, mein Code war fertig und funktionierte, also habe ich die temporäre Tabelle gelöscht und versucht, die gesamte Anweisung erneut auszuführen. Dabei erhalte ich jedoch die folgende Fehlermeldung:

ORA-06550: line 11, column 19:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 11, column 7:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Dann habe ich meine else-Anweisung in this geändert und jetzt funktioniert es wieder:

ELSE
  EXECUTE IMMEDIATE 'insert into test (hello) values (''hi'')';

Meine Frage ist, warum ich beim Laufen einzeln einfach die Einfügung anstelle von EXECUTE IMMEDIATE verwenden kann und warum meine SELECT-Anweisung direkt nach BEGIN immer noch funktioniert, wenn der Rest EXECUTE IMMEDIATE zu benötigen scheint, um ordnungsgemäß zu laufen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage