2011-11-10 16 views
0

次のストアド・プロシージャは、OracleデータベースからすべてのBLOB値を取得し、OraFolderという名前のフォルダに保存するためのものです。本当にこのストアドプロシージャのパラメータが必要ですか?

コンパイルは問題ありませんが、2つの質問があります。

1には、pnameとdisplay_nameの2つのパラメータがあります。私は私の必要性に合うようなコードをグーグルで探そうとしたので、私は彼らが何のためにいるのか分からないことを認めなければなりません。

私の質問は本当に2つのパラメータが必要です。すべてのBLOB値をフォルダに抽出しようとしていますか?

2答えが「はい」の場合、私はそれらを使用する必要があります。どのように使用しますか?

最後に、Entry_Idがありますが、私はそれが宣言されていないというエラーを受けています。私はそれを取り除かなければならなかった。それは何のために使われますか?

ソーラー、私はオラクルの男ではなく、私の周りに落とされた問題を解決するためにただのことを考えようとしています。ここでは、事前

おかげで、完全なストアドプロシージャです。

create or replace PROCEDURE blob2file(pfname VARCHAR2, display_name in varchar2) IS 



vblob BLOB; 
vstart NUMBER := 1; 
bytelen NUMBER := 32000; 
len NUMBER; 
my_vr RAW(32000); 
x NUMBER; 
v_name varchar2(100); 
lv_str_len NUMBER; 
l_output utl_file.file_type; 



BEGIN 
-- define output directory 
lv_str_len := length(pfname); 
--v_name := display_name||upper(substr(pfname,lv_str_len-3,lv_str_len)); 
v_name := display_name; 
l_output := utl_file.fopen('MY_FOLDER', v_name, 'w', 32760); 



-- get length of blob 
SELECT dbms_lob.getlength(blob_content) 
INTO len 
FROM portal.WWDOC_DOCUMENT$ 
WHERE FILENAME = pfname; 


-- dbms_output.put_line('Length: '||len); 
-- save blob length 
x := len; 



-- select blob into variable 
SELECT blob_content 
INTO vblob 
FROM portal.WWDOC_DOCUMENT$ 
WHERE FILENAME = pfname; 



-- if small enough for a single write 
IF len < 32760 THEN 
-- dbms_output.put_line('Single write '); 
utl_file.put_raw(l_output,vblob); 
utl_file.fflush(l_output); 
ELSE -- write in pieces 
-- dbms_output.put_line('multi write '||vstart); 
vstart := 1; 
WHILE vstart < len 
LOOP 

dbms_lob.read(vblob,bytelen,vstart,my_vr); 



utl_file.put_raw(l_output,my_vr); 
utl_file.fflush(l_output); 



-- set the start position for the next cut 
vstart := vstart + bytelen; 



-- set the end position if less than 32000 bytes 
x := x - bytelen; 
IF x < 32000 THEN 
bytelen := x; 
END IF; 
END LOOP; 
END IF; 
dbms_output.put_line('End'); 
utl_file.fclose(l_output); 
EXCEPTION 
when others then dbms_output.put_line('ERROR:'||entry_id); 
END blob2file; 
+0

私は、これはあなたがコンパイルするようになったアップハッキング1と仮定しています。 PLは、ADAに基づいた他の言語と同じ規則を持つチューリング完全言語です。元のSPを私に見せてください。私は何ができるかを見ていきます。 – FlyingGuy

+0

よろしくお願いいたします。あなたが要求したオリジナルのコードを置き換えました。 – Kenny

答えて

0

pfname paramは、どのファイルを取得するかを定義しているため、必要なものは不要です。

paramが出力ディレクトリを定義しているため、ディレクトリをハードコードする場合は可能です。

すべてのファイルをしたいので、あなたが一度に一つのテーブルおよび出力のすべてのレコードをループする必要があります:

CREATE OR REPLACE PROCEDURE blob2file 
IS 
    l_output utl_file.file_type; 
    vstart  NUMBER := 1; 
    bytelen  NUMBER := 32000; 
    x   NUMBER; 
    my_vr  RAW(32000); 
BEGIN 

    FOR recFiles IN (SELECT dbms_lob.getlength(BLOB_CONTENT) as len, 
          FILENAME, 
          BLOB_CONTENT 
         FROM PORTAL.WWDOC_DOCUMENT$) 
    LOOP 

     l_output := utl_file.fopen('MY_FOLDER', '/hard code the path here/', 'w', 32760); 

     IF recFiles.len < 32760 THEN 

     utl_file.put_raw(l_output, recFiles.BLOB_CONTENT); 
     utl_file.fflush(l_output); 

     ELSE -- write in pieces 

     vstart := 1; 

     WHILE vstart < refFiles.len 
     LOOP 
      dbms_lob.read(recFiles.BLOB_CONTENT, bytelen, vstart, my_vr); 
      utl_file.put_raw(l_output, my_vr); 
      utl_file.fflush(l_output); 

      -- set the start position for the next cut 
      vstart := vstart + bytelen; 

      -- set the end position if less than 32000 bytes 
      x := x - bytelen; 

      IF x < 32000 THEN 
       bytelen := x; 
      END IF; 

     END LOOP; 

     END IF; 

     utl_file.fclose(l_output); 
     dbms_output.put_line('End'); 

EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line('ERROR: ' || SQLERRM); 

END blob2file; 
+0

非常にありがとうございました。エキスパート、私はコードの私のバージョンが動作していた。私は、指定されたフォルダにデータベースからいくつかのファイルを抽出することができました。すべてがよかった。ただし、2つのファイルが正常に抽出された後、他のファイルを展開しようとすると、「無効な16進数」というエラーが表示されます。私の目標は、私が正しく働いていることを確認することでした。そして、wweikerがこの素晴らしいソリューションを使ってすべてのファイルを抽出しましたが、これまでのところうまくいきません。あなたは助けてもらえますか? – Kenny

+0

@Kennyエラーの詳細を投稿できますか?行番号、例外メッセージ...どこでエラーが発生しているのですか?自分のコードで、元のコードで、あるいはそれらが合併していますか? – wweicker

0

のように見えます。vnameは、BLOBが書き込まれるファイルの名前です。そしてpnameはテーブルのブロブのキーです。したがって、テーブルにすべてのブロブをダンプする場合、これらのブロブは必要ありませんが、ブロブごとに固有のファイル名が必要になります。

関連する問題