본문 바로가기

DB/__Oracle

SQL로 OS 자원을 조작하고 싶을 때 - Java Stored Procedure의 활용

SQL로 OS 자원을 조작하고 싶을 때 - Java Stored Procedure의 활용

출처: http://ukja.tistory.com/309

SQL과 PL/SQL의 다양한 기능에 익숙해지다보면 Oracle이 설치되어 있는 OS 시스템의 자원을 SQL이나 PL/SQL로 제어하고 싶은 욕구가 생깁니다. SQL과 PL/SQL의 활용을 극대화하고 싶은 자연스러운 욕구입니다. Java Stored Procedure가 이런 요구사항을 해결하는데 가장 강력한 도구입니다.

실제로 제가 개발하고 있는 트러블슈팅팩이라는 라이브러리도 내부적으로 Java Stored Procedure를 폭넓게 활용하고 있습니다.

간단한 예를 들어 설명해보겠습니다. 다음과 같은 요구사항이 있습니다.

  • Oracle이 설치된 시스템의 특정 폴더의 파일 리스트를 SQL을 이용해서 얻고 싶습니다.
다음과 같이 해결할 수 있습니다.
01 UKJA@ukja1106> connect sys/oracle@ukja1106 as sysdba
02 Connected.
03   
04 Session altered.
05   
06 Elapsed: 00:00:00.00
07   
08        SID    SERIAL# PID
09 ---------- ---------- ----------
10        129      12732 12376
11   
12 Elapsed: 00:00:00.00
13 SYS@ukja1106> 
14 SYS@ukja1106> exec dbms_java.grant_permission('UKJA', 'SYS:java.io.FilePermission', -
15 >   'c:\temp', 'read ,write, execute, delete');
16   
17 PL/SQL procedure successfully completed.
18   
19 Elapsed: 00:00:00.03
20 SYS@ukja1106> 
21 SYS@ukja1106> connect ukja/ukja@ukja1106
22 Connected.
23   
24 Session altered.
25   
26 Elapsed: 00:00:00.00
27   
28        SID    SERIAL# PID
29 ---------- ---------- ----------
30        129      12734 10400
31   
32 Elapsed: 00:00:00.00
33 UKJA@ukja1106> 
34 UKJA@ukja1106> create or replace and compile java source named FileList
35   as
36   3    import java.io.*;
37   4    import java.util.*;
38   5    import java.sql.*;
39   6    import oracle.sql.*;
40   7  
41   8    public class FileList {
42   9  
43  10       public static oracle.sql.ARRAY getFileList() throws Exception {
44  11  
45  12         File f = new File("c:\\temp");
46  13         String[] flist = f.list();
47  14  
48  15         Connection conn = DriverManager.getConnection("jdbc:default:connection:");
49  16  
50  17         ArrayDescriptor desc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", conn);
51  18         ARRAY array = new ARRAY(desc, conn, flist);
52  19         return array;
53  20       }
54  21  
55  22    }
56  23  ;
57  24  /
58   
59 Java created.
60   
61 Elapsed: 00:00:00.18
62 UKJA@ukja1106> 
63 UKJA@ukja1106> create or replace type varchar2_array as table of varchar2(1000);
64   2  /
65   
66 Type created.
67   
68 Elapsed: 00:00:00.01
69 UKJA@ukja1106> 
70 UKJA@ukja1106> 
71 UKJA@ukja1106> create or replace function get_file_list
72   2    return varchar2_array
73   3    as language java
74   4    name 'FileList.getFileList() return oracle.sql.ARRAY';
75   5  /
76   
77 Function created.
78   
79 Elapsed: 00:00:00.00
80 UKJA@ukja1106> 
81 UKJA@ukja1106> select * from table(get_file_list);
82   
83 COLUMN_VALUE
84 --------------------------------------------------------------------------------
85 1269319491031.sql
86 1269319491031.txt
87 20100323.log
88 343225818.out
89 343225818.trc
90   
91 Elapsed: 00:00:00.03
92 UKJA@ukja1106>
아주 간단하고 강력합니다. 잘 활용하면 많은 작업을 자동화할 수 있습니다.