메뉴 건너뛰기

Dev tips

DataBase [oracle] PLSQL에서 LONG RAW DATA DML 하기

taknim 2009.09.25 18:25 조회 수 : 12330 추천:2819

http://forums.oracle.com/forums/thread.jspa?messageID=1673845제품 : PL/SQL

작성날짜 : 2004-07-30

PLSQL에서 LONG RAW DATA DML 하기
============================



PURPOSE



--------------------------------------------------------------------------------

이 자료는 PL/SQL에서 LONG RAW column을 select / insert 하는 자료이다.

Explanation



--------------------------------------------------------------------------------

Example

--------------------------------------------------------------------------------

-- 테이블과 패키지를 만든다.

CREATE TABLE testraw (col1 NUMBER, col2 LONG RAW);
/

CREATE OR REPLACE PACKAGE testrawio AS

-- plsql 에서 long 이나 long raw 라는 변수는
-- 없으면 이것은 varchar2 로 변환됨.

PROCEDURE testrawio(rawparam in out varchar2);

-- long raw 와 varchar2 format 변환.

FUNCTION chartoraw(v_char varchar2) return long raw;
FUNCTION rawtochar(v_raw long raw) return varchar2;

-- decimal 과 hex format 변환

FUNCTION numtohex(v_hex number) return varchar2;
FUNCTION hextonum(v_hex varchar2) return number;

END;
/

CREATE OR REPLACE PACKAGE BODY testrawio
as


PROCEDURE testrawio(rawparam in out varchar2)
is
rawdata long raw;
rawlen number;
outlen number;
hex varchar2(32760);
i number;
begin
dbms_output.put_line('Value In :' ||rawparam);

-- 변수의 길이을 구해서 long raw 로 변환

rawlen := length(rawparam);
rawdata := chartoraw(rawparam);

INSERT INTO testraw VALUES (rawlen, rawdata);
COMMIT;
SELECT col1, col2 INTO outlen, rawdata FROM testraw;

-- 변수를 초기화하고 변환된 long raw 를 buffer로 할당

rawparam := '';
rawparam := rawtochar(rawdata);

dbms_output.put_line('Value Out:' ||rawparam);
if outlen = length(rawparam) then
dbms_output.put_line('All bytes retrieved');
else
dbms_output.put_line('Checksum failed');
end if;
end;


FUNCTION chartoraw(v_char varchar2) return long raw
is
rawdata long raw;
rawlen number;
hex varchar2(32760);
i number;
begin
rawlen := length(v_char);
i := 1;
while i <= rawlen
loop
hex := numtohex(ascii(substrb(v_char,i,1)));
rawdata := rawdata || HEXTORAW(hex);
i := i + 1;
end loop;

return rawdata;
end;


FUNCTION rawtochar(v_raw long raw) return varchar2
is
rawlen number;
hex varchar2(32760);
rawparam varchar2(32760);
i number;
begin
hex := rawtohex(v_raw);
rawlen := length(hex);
i := 1;
while i <= rawlen
loop
rawparam := rawparam||CHR(HEXTONUM(substrb(hex,i,2)));
i := i + 2;
end loop;

return rawparam;
end;


FUNCTION numtohex(v_hex number) return varchar2
is
hex varchar2(4);
num1 number;
num2 number;
begin
num1 := trunc(v_hex/16);
num2 := v_hex-(num1*16);

if ( num1 >= 0 and num1 <= 9 ) then
hex := hex||to_char(num1);
end if;
if num1 = 10 then hex := hex||'A'; end if;
if num1 = 11 then hex := hex||'B'; end if;
if num1 = 12 then hex := hex||'C'; end if;
if num1 = 13 then hex := hex||'D'; end if;
if num1 = 14 then hex := hex||'E'; end if;
if num1 = 15 then hex := hex||'F'; end if;

if ( num2 >= 0 and num2 <= 9 ) then
hex := hex||to_char(num2);
end if;
if num2 = 10 then hex := hex||'A'; end if;
if num2 = 11 then hex := hex||'B'; end if;
if num2 = 12 then hex := hex||'C'; end if;
if num2 = 13 then hex := hex||'D'; end if;
if num2 = 14 then hex := hex||'E'; end if;
if num2 = 15 then hex := hex||'F'; end if;

return hex;
end;


FUNCTION hextonum(v_hex varchar2) return number
is
hex varchar2(4);
num number;
num1 number;
num2 number;
begin
hex := substrb(v_hex,1,1);

if ( hex >= '0' and hex <= '9' ) then
num1 := to_number(hex);
end if;
if hex = 'A' then num1 := 10; end if;
if hex = 'B' then num1 := 11; end if;
if hex = 'C' then num1 := 12; end if;
if hex = 'D' then num1 := 13; end if;
if hex = 'E' then num1 := 14; end if;
if hex = 'F' then num1 := 15; end if;

hex := substrb(v_hex,2,1);

if ( hex >= '0' and hex <= '9' ) then
num2 := to_number(hex);
end if;
if hex = 'A' then num2 := 10; end if;
if hex = 'B' then num2 := 11; end if;
if hex = 'C' then num2 := 12; end if;
if hex = 'D' then num2 := 13; end if;
if hex = 'E' then num2 := 14; end if;
if hex = 'F' then num2 := 15; end if;


num := (num1*16)+num2;
return num;
end;


end;
/



-- Test Sample

set termout on
set serveroutput on
variable rawparam varchar2(100);
begin
:rawparam := '이 샘플은 long raw를 sqlplus 에서 insert select 하는 자료입니다.';
end;
/

truncate table testraw;
execute testrawio.testrawio(:rawparam);


Sample Output:

Value In :이 샘플은 long raw를 sqlplus 에서 insert select 하는 자료입니다.
Value Out:이 샘플은 long raw를 sqlplus 에서 insert select 하는 자료입니다.

번호 제목 글쓴이 날짜 조회 수
82 [MySQL] FIND_IN_SET 배열 형식의 값을 비교할 때 사용 taknim 2017.10.18 28
81 mysql split 함수 (split_str) taknim 2017.03.14 125
80 [MSSQL] DataBase 안에 있는 procedure에 텍스트 내용을 검색 프로시저 생성 taknim 2015.11.19 1372
79 sqlite3 테이블 정보 관련 쿼리 taknim 2014.03.22 3637
78 [MSSQL] mdf 파일로 DB 복원하기 taknim 2013.08.28 4651
77 [MySQL] 전체 테이블 mysqlcheck repair & optimize taknim 2013.06.11 5246
76 [oracle] isqlplus 에서 특수문자(&) 입력하는 방법 taknim 2012.08.10 16050
75 [오라클] 프로시저 확인하기 taknim 2011.10.04 8065
74 오라클9i 에서 MD5 암호화 taknim 2010.06.08 13038
73 [MSSQL] MS-SQL 동적쿼리 이용하기 taknim 2009.12.28 16962
» [oracle] PLSQL에서 LONG RAW DATA DML 하기 taknim 2009.09.25 12330
71 [oracle] 실행계획 보기, 토드 설정법 explain plan taknim 2009.09.24 12154
70 [MySQL] 사용자 계정 관리하기 (추가/변경/삭제) taknim 2009.09.18 10036
69 [mysql] mysqlbinlog 실행시 캐릭터셋(utf8) 오류 taknim 2009.08.25 15753
68 [mysql] 동적 쿼리 생성시 변수를 대입하거나 값을 받아오기 taknim 2009.08.17 17168
67 [MSSQL] sp_who2 를 대신할 sql 코드 file taknim 2009.08.13 10929
66 [MSSQL] 변수를 TABLE로 선언 후 데이터 입력 taknim 2009.07.30 11692
65 [ORACLE] Flashback (과거시점에서 질의실행) taknim 2009.07.06 10141
64 [Oracle] DBNEWID Utility - DBNAME,DBID변경하기 taknim 2009.07.06 15572
63 [Oracle] INSERT … ON DUPLICATE KEY UPDATE taknim 2009.06.25 13653