2017-10-23 20 views
0

ローカルマシン上の一連のテンプレートファイルを読み込み、データをoracleデータベースのclob列に格納しようとしています。私は、ファイル名がハードワイヤードであるときは本当によく働く何かを持っている:oracle -PL/SQLファイル名の宣言で変数名を解決する

Declare 
    v_Template clob:= ' 
    @@MyFolder\MyFilename.txt 
    '; 

    Begin 
    --Insert the contents of the file into a Clob column in the database 
    end; 
    /

この変数値は、後にテーブルのCLOB列に挿入されます。

ここで説明します。 https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjGjI7i24fXAhXhx1QKHQ14AcoQFggmMAA&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F19721274%2Fcan-sqlplus-read-the-contents-of-a-file-into-a-variable&usg=AOvVaw3qxvCpXHc9D2tof3Gisvlz

しかし、ファイル名の変数を配置しようとすると、v_templateの値にファイルの内容ではなく変数の名前が設定されます。これを適切に解決する方法がいくつかありますか?たとえば、

DECLARE 
-- the @@ expression must be in separate line as follows 

Myfilename varchar(50):='@@MyPath\Template_File.txt'; 

file_contents VARCHAR2(32767):=' 
&&MyFileName 
'; 
Begin 
insert into MyTAble (template_definition) 
values(file_contents); 
commit; 

end; 

答えて

0

最初の例のように、ダブルアットマークが1行に必要です。

set serveroutput on 

Declare 
file_contents VARCHAR2(32767) := ' 
@@c:\temp\efs.txt 
'; 
BEGIN 
    dbms_output.put_line('==='); 
    dbms_output.put_line(file_contents); 
    dbms_output.put_line('==='); 
END; 
/
=== 

this is 
a test 

=== 

PL/SQL procedure successfully completed. 

SQL> 
+0

ありがとうございますが、&&は機能しませんでした。値 '&& MyFileName'は、MyFileName変数で定義されているファイルの内容ではなく、表に挿入されます。私が 'set define off'を削除すると、MyFileNameの値の入力が求められます。 これはファイル名を変数にすることで、ディレクトリの内容を読み込み、ファイルのリストをループすることができます。あなたの提案に合うように2番目のコードブロックを編集しました。 – CMB

+0

私の答えは、ダブルアットサインでした。私が「アットマーク」を意味するとき、「アンパサンド」とタイプしました。あなたはファイル名の入力を求めていますか?その間に私は誤植を訂正します。 –

+0

ファイル名の入力を求めたくありません。ファイル名(MyFileName)に変数を使用し、そのファイルの内容を別の変数(File_Contents)に読み込みたいとします。上記のあなたの例では、ファイル名が非常にうまくいきます。しかし、@ @ MyFileNameVariableのときは動作させることができません。それはそれを読まないか、File_Contents変数にファイルの内容の代わりにファイルの名前を設定します。これを調べてくれてありがとう。 – CMB

関連する問題