2017-09-04 12 views
0

私は、PL SQLダイナミックディレクトリ(オラクル)

 CREATE OR REPLACE PROCEDURE LOAD (file_path VARCHAR2) 
    AS 
    BEGIN 
    EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY ext_tab_data AS '''||file_path||''' '; 
    EXECUTE IMMEDIATE ' 
    CREATE TABLE DUMMY 
    (
     col1  VARCHAR2(2000), 
     col2  VARCHAR2(2000) 
    ) 
    ORGANIZATION EXTERNAL 
     (
      TYPE oracle_loader 
      DEFAULT DIRECTORY ext_tab_data 
      ACCESS PARAMETERS 
      (
        RECORDS DELIMITED BY NEWLINE 
        badfile ext_tab_data:''bad_file.bad'' 
        logfile ext_tab_data:''logs.log'' 
        RECORDS DELIMITED BY NEWLINE 
        (FIELDS TERMINATED BY '','') 
        MISSING FIELD VALUES ARE NULL 
        ( 
          col1 CHAR , 
          col2 CHAR 

      )) 
       LOCATION (''F1.txt'') 
    )REJECT LIMIT UNLIMITED;'; 
    END; 

/
EXEC LOAD('C:\Users\external_table_new'); 

で、次の手順を使用しています。しかし、これは動作しません、私は

exec load 
Error report - 
ORA-00922: missing or invalid option 
ORA-06512: at "SYSTEM.LOAD", line 7 
ORA-06512: at line 1 
00922. 00000 - "missing or invalid option" 
*Cause:  
*Action: 

オラクル、このエラーを取得しています誰でも助けてもらえますか?私は、プロシージャがパラメータを渡すことによって実行されるときにディレクトリ名を動的に追加したい。

+0

は、ディレクトリの作成、動的に奇妙な要件と思われます。 'ディレクトリを作成... 'すると、ディレクトリのファイルパスがサーバで利用可能でなければなりません。あなたは本当にサーバーに利用できるディレクトリを追加/変更していますか?通常は、少数のディレクトリ(入力ファイル用、出力用など、またはタイプAファイル用、タイプBファイル用など)を作成し、関連するディレクトリにファイルを移動します。なぜOracleでディレクトリを動的に作成する必要があるのか​​不思議です。 – Boneist

+0

感謝の骨子.. ..yaそれは私が望んだものです。単一のプロシージャで可能か、別のプロシージャ(ディレクトリ用)を作成し、このロードプロシージャを呼び出す必要がありますか?私は両方のステートメントを1つのプロシージャにexcecuteすることはできないので...あなたは解決策を持っていますか? – steve

+0

まず、SYSTEMスキーマ(またはSYS)にオブジェクトなどを作成しないでください。これを行うための新しいスキーマを作成する必要があります。 (私はこれを言っています。なぜなら、SYSとSYSTEMは "特別な"スキーマなので、意図しない副作用が発生する可能性があります。それは、問題がcreate table文にあるように見えます。 – Boneist

答えて

1

動的SQL文をセミコロンで終わらないようにしてください。実行直後のcreate tableステートメントから最後の;を削除します。

また、代替の引用構文を使用して調べることもできます。これにより、エスケープすることなく動的SQLを含めることができます。例えば

execute immediate q'[ 
    create table dummy ... 
    ... 
        badfile ext_tab_data:'bad_file.bad' 
    ... 
    )REJECT LIMIT UNLIMITED 
]';