angelface

程序◆生活

 

Pass an array of oracle object of array

  我们知道,在oracle里面我们可以自定义类型,例如:

1 CREATE OR REPLACE
2 TYPE STRTYPE AS OBJECT(col1  varchar2(100), col2  varchar2(200))

我们定义了一个oracle自定义的类型,然后在声明一个这种类型的数组:

CREATE OR REPLACE
TYPE ARRTAB 
AS TABLE OF STRTYPE
/

然后我们在创建一个以"ARRTAB"为IN/OUT参数的存储过程:(首先要建立一个张表: CREATE TABLE POINTS
(
X NUMBER NOT NULL,
Y NUMBER NOT NULL
)
)

 1 CREATE OR REPLACE PROCEDURE TEST_PASS_ARRAY_TO_ORACLE(p_array IN ARRTAB) AS
 2 li_num PLS_INTEGER := 1;
 3 BEGIN
 4         for li_num in 1..2
 5         loop
 6                 Insert into points(x, y) values(p_array(li_num).col1, p_array(li_num).col2);
 7         end loop;
 8         commit;
 9         INSERT INTO POINTS(X, Y) VALUES('x''y');
10         commit;
11         DBMS_OUTPUT.PUT_LINE('ok run at here');
12         EXCEPTION
13                 WHEN   others   THEN
14                           rollback;
15                       raise_application_error(sqlcode,'Failed to insert to table POINTS:   '   ||   sqlerrm);
16 
17 END TEST_PASS_ARRAY_TO_ORACLE;
18 /
19 
20 

所有的东西都准备好了,我们应该怎样在java中调用呢? 如果想调用这个存储过程,首先必须要让java程序知道我们定义的oracle对象到底是什么样的,我们定义的oracle数组到底是什么样的.下面的方法可以做到:
1 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:dev","dev""dev");
2 
3 StructDescriptor pDesc = StructDescriptor.createDescriptor("STRTYPE", conn);
4 ArrayDescriptor aDesc = ArrayDescriptor.createDescriptor("ARRTAB", conn);

STRTYPE是我们前面在oracle定义的对象类型,同样ARRTAB是oracle数组的类型.接下来我们便可以便用pDesc, aDesc来创建传递给oracle的java对象与数组了:

 1 Object[] arrobj = new Object[2];
 2             for (int i = 0; i < 2; i++) {
 3                 Object[] cvsLine = { "1""1" };
 4                 STRUCT cvsLineStruct = new STRUCT(pDesc, conn, cvsLine);
 5                 arrobj[i] = cvsLineStruct;
 6             }
 7             ARRAY pArray = new ARRAY(aDesc, conn, arrobj);
 8             
 9             OracleCallableStatement ocs = (OracleCallableStatement)conn.prepareCall("{call TEST_PASS_ARRAY_TO_ORACLE(?)}");
10             ocs.setARRAY(1, pArray);
11             ocs.execute();

Ok.大功告成.

oracle的jdbc driver扩展了很多标准的api,有兴趣的可以在这里看到:
http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/overvw.htm





posted on 2007-08-03 00:04  angelface  阅读(450)  评论(0)    收藏  举报

导航