2011-11-10 2 views
0

다음 저장 프로시 저는 Oracle 데이터베이스에서 모든 BLOB 값을 가져 와서 OraFolder라는 폴더에 저장합니다.이 저장 프로 시저에 매개 변수가 실제로 필요합니까?

잘 컴파일되지만 질문이 2 개 있습니다.

1, pname과 display_name의 두 매개 변수가 있습니다. 나는 우리가 필요로하는 코드를 봤기 때문에 내가 그곳에 무엇이 있는지 몰랐다는 것을 인정해야한다.

제 질문은 폴더에 BLOB 값을 모두 추출하려고하는데 2 개의 params가 필요합니까?

2 대답이 '예'인 경우, 어떻게 사용해야합니까?

마지막으로 Entry_Id가 있습니다. 선언하지 않은 오류가 계속 발생했습니다. 나는 그것을 제거해야만했다. 그것은 무엇을 위해 사용됩니까?

Sorr, 나는 오라클 사람이 아니다. 나의 랩에 떨어 뜨린 문제를 해결하기 위해 노력하고있다. 여기

사전

에서

덕분에 전체 저장된 프로 시저입니다. vname이 덩어리가 기록되는 파일의 이름처럼

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

나는이 가정하고 당신이 컴파일있어 최대 해킹입니다. 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

대단히 고맙습니다. Experts, 나는 코드의 제 버전을 사용했습니다. 데이터베이스에서 지정된 폴더로 파일 몇 개를 추출 할 수있었습니다. 모두 좋게 보였다. 그러나 2 개의 파일을 성공적으로 추출한 후 다른 파일을 추출하려고하면 "16 진수가 유효하지 않습니다"라는 오류가 발생하여이 오류를 해결할 수 없습니다. 내 목표는 올바르게 작동하는지 확인하는 것이 었습니다. 그런 다음 wweiker가이 멋진 솔루션을 사용하여 모든 파일을 추출했지만 지금까지 제대로 작동하지 않습니다. 좀 도와 줄 수있어? – Kenny

+0

@Kenny 오류 정보를 게시 할 수 있습니까? 행 번호, 예외 메시지 ... 오류가 어디에서 발생 했습니까? 내 코드에서 또는 원래 코드로, 또는 이들이 합쳐 졌습니까? – wweicker

0

보인다. 그리고 pname은 표의 BLOB 키입니다. 따라서 테이블에 모든 얼룩을 버리면이 중 하나가 필요하지 않지만 각 얼룩에 대해 고유 한 파일 이름을 제시해야합니다.