Pro*C에서 EXTERNAL LOB (BFILE) 처리 예제 프로그램
EXTERNAL LOB (BFILE) 처리 예제 프로그램
Bulletin no : 11344
--------------------------------------------------------------------------------
BFILE type은 화일시스템에 존재하는 FILE을 가리키는 LOCATOR를 저장하는 데이타
타입이다. 이 LOCATOR는 디렉토리 ALIAS, FILENAME, 기타 상태 정보를 포함하고
있다. BFILE은 Directory를 통해 access될 수 있다.
디렉토리란 시스템 상의 물리적 디렉토리를 논리적으로 매핑한 alias명을 말한다.
이 오브젝트는 시스템 소유로서, 디렉토리를 생성/삭제하기 위해서는 create[drop]
any directory 권한이 있어야 한다. sys로 connect하여 grant를 실행한다.
SQL> grant create any directory to scott;
디렉토리 생성 시는 실제 디렉토리가 있는지 여부는 확인하지 않는다는 점을 주의
해야 한다. 현재 생성된 디렉토리와 관련된 정보는 all_directories,
dba_directories를 조회하면 확인 가능하다.
Bfile은 pointer 형태로 저장하기 때문에, 여러 record에서 동일한 file을 value
로 가질 수 있다. file에 대한 처리는 Read만 가능하고, 디렉토리와 마찬가지로
BFILE 컬럼에 insert 시 oracle process가 read 권한이 있는지 여부는 확인하지
않는다.
이는 insert하는 user가 미리 확인해야 한다. 하나의 세션에서 동시에 열 수 있는
file 개수는 session_max_open_files parameter에 의해 제한받는다.
1) 사전 수행 SQL 문
SQL> connect sys/manager
SQL> grant create any directory to scott;
SQL> connect scott/tiger
SQL> create or replace directory bfile_dir as '/mnt3/rctest80/';
SQL> create table image_file
2 (a varchar2(10),
3 b bfile);
SQL> desc blobs
Name Null? Type
------------------------------- -------- ----
ID VARCHAR2(255)
BLOB_COL BLOB
2) 프로그램 예제
#include
#include
char username[10] ="ejpark";
char password[10] ="ejpark";
char i_rep_file_dir[20];
char i_rep_file_name[20];
void sql_error();
main()
{
EXEC SQL WHENEVER SQLERROR DO sql_error("oracle error --");
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf(" DB connected \n");
/* bfile 컬럼을 insert */
EXEC SQL INSERT INTO image_file VALUES
('abc' ,bfilename('BFILE_DIR','a30.bmp') );
printf(" Bfile inserted \n");
EXEC SQL COMMIT ;
EXEC SQL EXECUTE
DECLARE
i_rep_file BFILE;
temp_blob BLOB;
v_rqid NUMBER;
len NUMBER;
BEGIN
/* bfile 컬럼을 select */
SELECT b INTO i_rep_file FROM image_file WHERE a='abc';
IF i_rep_file is not null THEN
IF DBMS_LOB.fileisopen(i_rep_file) = 1 THEN
DBMS_LOB.fileclose(i_rep_file);
END IF;
DBMS_LOB.FILEGETNAME(i_rep_file,:i_rep_file_dir,:i_rep_file_name);
len := DBMS_LOB.GETLENGTH(i_rep_file);
/* 해당 데이타 화일을 읽어 lob table에 insert */
INSERT INTO blobs VALUES ('abc', empty_blob())
RETURNING blob_col INTO temp_blob;
DBMS_LOB.FILEOPEN(i_rep_file, dbms_lob.file_readonly);
DBMS_LOB.LOADFROMFILE(temp_blob,i_rep_file,len);
DBMS_LOB.FILECLOSE(i_rep_file);
END IF;
COMMIT;
END;
END-EXEC;
printf("name %s %s", i_rep_file_dir,i_rep_file_name);
}
void sql_error(msg)
char* msg;
{
char err_msg[130];
int buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n%s\n",msg);
buf_len = sizeof(err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
EXTERNAL LOB (BFILE) 처리 예제 프로그램
Bulletin no : 11344
--------------------------------------------------------------------------------
BFILE type은 화일시스템에 존재하는 FILE을 가리키는 LOCATOR를 저장하는 데이타
타입이다. 이 LOCATOR는 디렉토리 ALIAS, FILENAME, 기타 상태 정보를 포함하고
있다. BFILE은 Directory를 통해 access될 수 있다.
디렉토리란 시스템 상의 물리적 디렉토리를 논리적으로 매핑한 alias명을 말한다.
이 오브젝트는 시스템 소유로서, 디렉토리를 생성/삭제하기 위해서는 create[drop]
any directory 권한이 있어야 한다. sys로 connect하여 grant를 실행한다.
SQL> grant create any directory to scott;
디렉토리 생성 시는 실제 디렉토리가 있는지 여부는 확인하지 않는다는 점을 주의
해야 한다. 현재 생성된 디렉토리와 관련된 정보는 all_directories,
dba_directories를 조회하면 확인 가능하다.
Bfile은 pointer 형태로 저장하기 때문에, 여러 record에서 동일한 file을 value
로 가질 수 있다. file에 대한 처리는 Read만 가능하고, 디렉토리와 마찬가지로
BFILE 컬럼에 insert 시 oracle process가 read 권한이 있는지 여부는 확인하지
않는다.
이는 insert하는 user가 미리 확인해야 한다. 하나의 세션에서 동시에 열 수 있는
file 개수는 session_max_open_files parameter에 의해 제한받는다.
1) 사전 수행 SQL 문
SQL> connect sys/manager
SQL> grant create any directory to scott;
SQL> connect scott/tiger
SQL> create or replace directory bfile_dir as '/mnt3/rctest80/';
SQL> create table image_file
2 (a varchar2(10),
3 b bfile);
SQL> desc blobs
Name Null? Type
------------------------------- -------- ----
ID VARCHAR2(255)
BLOB_COL BLOB
2) 프로그램 예제
#include
#include
char username[10] ="ejpark";
char password[10] ="ejpark";
char i_rep_file_dir[20];
char i_rep_file_name[20];
void sql_error();
main()
{
EXEC SQL WHENEVER SQLERROR DO sql_error("oracle error --");
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf(" DB connected \n");
/* bfile 컬럼을 insert */
EXEC SQL INSERT INTO image_file VALUES
('abc' ,bfilename('BFILE_DIR','a30.bmp') );
printf(" Bfile inserted \n");
EXEC SQL COMMIT ;
EXEC SQL EXECUTE
DECLARE
i_rep_file BFILE;
temp_blob BLOB;
v_rqid NUMBER;
len NUMBER;
BEGIN
/* bfile 컬럼을 select */
SELECT b INTO i_rep_file FROM image_file WHERE a='abc';
IF i_rep_file is not null THEN
IF DBMS_LOB.fileisopen(i_rep_file) = 1 THEN
DBMS_LOB.fileclose(i_rep_file);
END IF;
DBMS_LOB.FILEGETNAME(i_rep_file,:i_rep_file_dir,:i_rep_file_name);
len := DBMS_LOB.GETLENGTH(i_rep_file);
/* 해당 데이타 화일을 읽어 lob table에 insert */
INSERT INTO blobs VALUES ('abc', empty_blob())
RETURNING blob_col INTO temp_blob;
DBMS_LOB.FILEOPEN(i_rep_file, dbms_lob.file_readonly);
DBMS_LOB.LOADFROMFILE(temp_blob,i_rep_file,len);
DBMS_LOB.FILECLOSE(i_rep_file);
END IF;
COMMIT;
END;
END-EXEC;
printf("name %s %s", i_rep_file_dir,i_rep_file_name);
}
void sql_error(msg)
char* msg;
{
char err_msg[130];
int buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n%s\n",msg);
buf_len = sizeof(err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-27 | 2022 | |
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-11 | 1478 | |
53 | [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 03-15 | 1233 |
52 | [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 01-31 | 1392 |
51 | [평일,기업100%환급]SQL기초에서 Schema Object까지 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 01-31 | 1254 |
50 | [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 01-31 | 1083 |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 01-19 | 1395 |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 01-11 | 1225 |
47 | [평일야간,주말주간]JAVA,Network&JSP&Spring,MyBatis,Hibernate | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 01-03 | 1724 |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-27 | 2022 |
45 | [기업100%환급,평일주간]자바기초에서 JDBC, Servlet/JSP까지 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-19 | 1491 |
44 | [평일야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,Jav… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-14 | 1468 |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-11 | 1478 |
42 | [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-09 | 1182 |
41 | [평일야간, 주말]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-01 | 1396 |
40 | [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-01 | 1544 |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | <nobr class="mw_basic_list_name" style="display: block; overflow: hidden; width: 90px; color: rgb(61, 91, 122); text-align: left;">오라클자바…</nobr> | 12-01 | 1050 |
댓글 없음:
댓글 쓰기