오라클: 블롭이 있는 테이블을 다시 가져올 수 있는 .sql 파일로 내보냅니다.
두 개의 필드가 있는 "이미지" 테이블이 있습니다.
- 이름 VARCHAR2
- 데이터 BLOB
다른 시스템에서 가져올 수 있는 .sql 파일로 테이블을 내보내고 싶습니다.Oracle SQL Developer의 "Database Unload" Assistant를 사용하여 이 작업을 수행하려고 했습니다.그러나 생성된 파일에는 이름에 대한 내용만 있고 데이터는 없습니다.따라서 가져온 후에는 모든 이름이 표시되지만 데이터 필드는 모든 곳에서 null입니다.
저는 정말로 그것이 하나의 파일이기를 원합니다(fs의 필드당 하나의 파일에 데이터를 버리는 것을 포함하는 몇 가지 예를 보았습니다...).
SQL Developer로 이러한 스크립트를 생성할 수 있습니까?또는 그렇게 할 수 있는 다른 방법/도구가 있습니까?
SQL Developer에서는 불가능하다고 생각합니다(그러나 자주 사용하지는 않습니다).
사용 중인 SQL 클라이언트(SQL Workbench/J)에서 이 작업을 수행할 수 있습니다.
이 데이터를 내보내는 방법은 여러 가지가 있습니다.
독점 스크립트 생성
특수(도구별) 표기법을 사용하여 다음과 같은 외부 파일을 참조하는 SQL 스크립트를 만들 수 있습니다.
INSERT INTO images
(name, data)
VALUES
('foobar', {$blobfile='blob_r1_c2.data'});
위의 문은 SQL Workbench에서만 다시 실행할 수 있습니다.다른 SQL 클라이언트와 호환되지 않습니다.
utl_raw 사용
다른 대안은 "블롭 리터럴"을 사용하는 것이지만, 문자 리터럴에 대한 오라클의 4000바이트 제한 때문에 이것은 매우 작은 블롭 값에만 작동합니다.
INSERT INTO images
(name, data)
VALUES
('foobar', to_blob(utl_raw.cast_to_raw('......')));
서 서기문 문자는의대의 cast_to_raw호출에는 BLOB의 16진수 값이 포함됩니다.이 작업에는 "블롭 바이트"당 2자가 필요하므로 2000바이트보다 큰 BLOB는 처리할 수 없습니다.그러나 이 구문은 거의 모든 Oracle SQL 도구에 적용됩니다(매우 긴 줄로 스크립트를 처리할 수 있는 경우).
SQL*로더 입력 파일
세 번째 방법은 SQL*Loader를 사용하여 가져올 수 있는 텍스트 파일로 데이터를 내보내는 것입니다.
텍스트 파일에는 다음과 같은 내용이 포함됩니다.
이름 데이터foobar blob_r1_c2.data
다음 SQL*Loader 제어 파일과 함께 제공됩니다.
OPTIONS(옵션=1)로드 데이터 문자 집합 'WE8ISO8859P15'이미지를 입력합니다.txt'추가테이블 이미지로'\t' 뒤에 오는 NullCOLS로 끝나는 필드(이름.lob_file_data 필러,EOF에 의해 종료된 데이터 LOBFILE(lob_file_data))
SQL*Loader를 사용하여 로드할 수 있으므로 데이터를 가져오는 데 SQL Workbench가 필요하지 않습니다.
자세한 내용은 설명서를 참조하십시오.
편집
Alex가 그의 의견에서 지적했듯이, DataPump 내보내기도 사용할 수 있지만, 이를 위해서는 서버의 파일 시스템에 액세스할 수 있어야 합니다.위의 솔루션은 모두 클라이언트에 데이터를 저장합니다.
BLOB를 가져오기 위해 단일 .sql 파일을 사용해야 하는 경우 PL/SQL을 사용하여 스크립트를 생성할 수 있습니다.
set serveroutput on
declare
lob_in blob;
i integer := 0;
lob_size integer;
buffer_size integer := 1000;
buffer raw(32767);
begin
select
data, dbms_lob.getlength(data)
into lob_in, lob_size
from images
where name = 'example.png';
for i in 0 .. (lob_size / buffer_size) loop
buffer := dbms_lob.substr(lob_in, buffer_size, i * buffer_size + 1);
dbms_output.put('dbms_lob.append(lob_out, hextoraw(''');
dbms_output.put(rawtohex(buffer));
dbms_output.put_line('''));');
end loop;
end;
출력은 다음과 같이 인코딩된 BLOB의 콘텐츠가 됩니다.
dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000'));
dbms_lob.append(lob_out, hextoraw('00000000...0000'));
...
dbms_lob.append(lob_out, hextoraw('007FFFD9'));
PL/SQL을 사용하여 이미 삽입된 행에 로드할 수 있는 항목:
declare
lob_out blob;
begin
select data into lob_out
from images
where name = 'example.png'
for update;
dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000'));
dbms_lob.append(lob_out, hextoraw('00000000...0000'));
...
dbms_lob.append(lob_out, hextoraw('007FFFD9'));
end;
결과적으로 생성되는 .sql 파일은 매우 클 것입니다.
답변해 주셔서 감사합니다.저는 세 번째 대안을 사용했습니다.먼저 SQL Workbench/J를 다운로드했습니다.그런 다음 다음 명령을 사용하여 내보내기를 수행했습니다.
WbExport -type=text -file='c:\temp\Images' delimiter='|' -decimal=',' -sourcetable=Images -formatfile=oracle;
이미지가 생성되었습니다.txt 파일 및 많은 Images_r*_c2.data 파일과 Images.ctl 파일이 있습니다.
그런 다음 다음 명령을 사용하여 가져올 수 있습니다.
sqlldr myuser@myhost/mypassword control=Images.ctl
이것은 SQL 개발자에서 확실히 가능합니다.
- 먼저 적절한 테이블을 선택하여 원본 위치에서 테이블을 내보내야 합니다.
도구 > 데이터베이스 내보내기
- 출력 형식을 다음으로 선택합니다.
loader삽입하기 보다는, 우리가 보통 사용하는 것보다 더 우수합니다.
다음 단계를 수행하면 다음과 같은 작업을 수행할 수 있습니다.sqlldr제어 파일 및 데이터 파일 및create table옵션을 선택한 경우 ddl.가져오기에 사용할 수 있습니다(sqlldr) 데이터가 대상에 있습니다.
이것은 더 나은 솔루션이며 추출 및 분배 측면에서 휴대가 가능합니다.코드 저장소를 통해 배포할 구성 요소를 유연하게 제공할 수 있습니다.
여기 그것을 단계별로 설명하는 링크가 있습니다.
Oracle SQL Developer를 사용하여 여러 BLOB 내보내기
SQL workbench는 .sql 이외에 BLOB 데이터에 대한 특수 파일 형식을 사용합니다.이러한 파일을 수락할 수 있는 경우 더 간단한 솔루션은 Oracle의 Original 가져오기 및 내보내기를 사용하는 것입니다. (이는 더 이상 사용되지 않지만 Oracle의 DataPump와 달리 서버에 대한 액세스 권한이 필요하지 않습니다.)
여기 수출 부분에 대한 좋은 튜토리얼이 있습니다.
언급URL : https://stackoverflow.com/questions/13531576/oracle-export-a-table-with-blobs-to-an-sql-file-that-can-be-imported-again
'codememo' 카테고리의 다른 글
| Asp에서 AJAX를 사용하여 양식을 제출합니다.넷 mvc 4 (0) | 2023.07.27 |
|---|---|
| 예외영구 저장소에서 세션 로드 (0) | 2023.07.27 |
| 제너레이터 이해는 정확히 어떻게 작동합니까? (0) | 2023.07.27 |
| 봄에 조건부 자동 배선을 어떻게 하나요? (0) | 2023.07.27 |
| 설치_실패_USER_Restricted : redmi 4 기기를 사용하는 안드로이드 스튜디오 (0) | 2023.07.27 |