2017-05-11 3 views
1

Das Verfahren dient zum Klonen einer Tabelle. Es empfängt die Namen der zwei Tabellen in Parametern, und wenn es aufgerufen wird, sollte es die Tabelle klonen.Unmittelbare und fehlende ungültige Option ausführen

CREATE OR REPLACE PROCEDURE CLONE_TABLE(
table_source VARCHAR2, 
table_destination VARCHAR2) 
is 
begin 
execute immediate 'create table ' || table_destination || 'as select* from ' 
|| table_source; 
end; 

Aber wenn ich die Prozedur aufrufen, erhalte ich Fehler ORA-00922: Missing or invalid option.

BEGIN 
CLONE_TABLE('example','example_new') 
END 

Ich weiß nicht, was das Problem ist und wie ich es beheben sollte.

Antwort

1

Es sollte ein Leerzeichen vor as select.. und zwischen select und * in der Nähe von select*... sein. diese

SQL> CREATE OR REPLACE PROCEDURE CLONE_TABLE(
table_source VARCHAR2, 
table_destination VARCHAR2) 
is 
begin 
execute immediate 'create table ' || table_destination || ' as select * from ' || table_source; 
end; 
/2 3 4 5 6 7 8 

Procedure created. 

SQL> create table example(id number); 

Table created. 

SQL> exec CLONE_TABLE('example','example_new'); 

PL/SQL procedure successfully completed. 
1

Verwendung:

CREATE OR REPLACE PROCEDURE CLONE_TABLE (table_source   VARCHAR2, 
             table_destination VARCHAR2) 
IS 
v_sql varchar2(1000); 
BEGIN 

v_sql:= 'create table ' 
     || table_destination 
     || ' as select * from ' 
     || table_source; 

dbms_output.put_line(v_sql); 

EXECUTE IMMEDIATE v_sql; 

END; 

Der beste Weg Problem zu behandeln, wie Sie bekam zuerst angezeigt werden, was Sie versuchen sofort auszuführen. Du wirst deine Schuld kennen lernen.

3

Das Schreiben von dynamischem SQL ist schwierig, weil Kompilierungsfehler zu Laufzeitfehlern werden. Es ist daher entscheidend, ein kühles Auge zu entwickeln, wenn Sie Ihren eigenen Code betrachten. Du musst der Compiler sein.

Es hilft, die Anweisung zuerst als eine Variable zusammenzustellen. Auf diese Weise können Sie die Anweisung im Fehlerfall anzeigen, was das Debugging erleichtert.

CREATE OR REPLACE PROCEDURE CLONE_TABLE(
    table_source VARCHAR2, 
    table_destination VARCHAR2) 
is 
    stmt varchar2(32767); 
begin 
    stmt := 'create table ' || table_destination || 'as select* from ' 
|| table_source; 
    execute immediate stmt; 
exception 
    when others then 
     dbms_output.put_line(stmt); 
     raise; 
end; 

Wenn Sie das getan hatte, wenn wäre offensichtlich gewesen, dass Sie einen Platz vor dem as fehlten. So Ihre ausgeführten Anweisung lautete:

create table example_newas select* from example 

Der Raum zwischen select und * ist optional, aber Code sieht besser aus mit ein.

+1

Danke für Ausnahmebehandlung Teil. Ich wusste nicht genau, wie ich es in meiner Antwort schreiben sollte. – Utsav

1

Es gibt nur 2 Problem und einige Vorschläge für Ihren Code.

  1. Fehlende Raum vor as select...
  2. Berufung des Verfahrens verwenden exec oder call Aussagen.

    Vorschläge:

    • Stellen Sie sicher, Umgang mit richtigen Fehler zu machen (so, wenn eine Tabelle nicht existiert, oder wenn eine Tabelle Ziel bereits vorhanden ist, können Sie die richtige Rückmeldung

      bekommen sollte
    • . auch trennt jedes Schlüsselwort mit Platz als andere Antworten vorgeschlagen, wie zwischen select und *. Aber nicht zu tun, es wird Ihnen Fehler nicht geben.

      CREATE OR REPLACE PROCEDURE CLONE_TABLE(
      table_source VARCHAR2, 
      table_destination VARCHAR2) 
      is 
      begin 
      execute immediate 'create table ' || table_destination || ' as select* from ' 
      || table_source; 
      end; 
      
      EXEC CLONE_TABLE('example','example_new') 
      
Verwandte Themen