2017-05-11 9 views
1

手順は、表のクローン作成用です。パラメータ内の2つのテーブルの名前を受け取り、呼び出されるとテーブルをクローンする必要があります。即時実行および無効な無効なオプション

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; 

しかし、手順を呼び出すと、エラーORA-00922: Missing or invalid optionが表示されます。

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

私は何が問題なのか分かりません。

答えて

1

as select..の前に、select*の間にあるスペースは、select*...の近くにある必要があります。

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

使用この:

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; 

あなたが得たような問題に対処するための最良の方法は、あなたがすぐに実行しようとしているものを最初に表示することです。あなたはあなたの欠陥を知るようになります。

3

コンパイルエラーとなるのは実行時エラーになるため、動的SQLの記述は難しいです。したがって、あなた自身のコードを見るときは、目を覚ますことが重要です。あなたはコンパイラでなければなりません。

最初にステートメントを変数としてアセンブルすると便利です。そうすれば、エラーが発生したときにステートメントを表示することができ、デバッグが容易になります。

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; 

あなたがいる場合は、あなたがasの前にスペースが欠落していたことは明らかであったであろうことを行っていた場合。 select*の間のスペースはオプションですが、コードは1で良く見える

create table example_newas select* from example 

:だからあなたの実行文は、このでした。

+1

例外処理の部分をありがとう。私は私の答えでそれをコード化する方法について正確にはわかりませんでした。 – Utsav

1

コードには2つの問題といくつかの提案があります。

  1. 手順のas select...
  2. 呼び出す前にスペースがありません、execまたはcallステートメントを使用しています。

    提案:

    • 適切なエラー処理を行うようにしてください(そのテーブルが存在しない、またはテーブルの先がすでに存在する場合、あなたは適切なリターン・メッセージを取得する場合

    • 。他の回答がselect間と*のように、提案した。しかし、それはあなたにエラーを与えることはありませんやっていないとしても、スペースで各キーワードを分ける。

      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') 
      
関連する問題