Pass an array of oracle object of array
我们知道,在oracle里面我们可以自定义类型,例如:
我们定义了一个oracle自定义的类型,然后在声明一个这种类型的数组:
然后我们在创建一个以"ARRTAB"为IN/OUT参数的存储过程:(首先要建立一个张表: CREATE TABLE POINTS
(
X NUMBER NOT NULL,
Y NUMBER NOT NULL
)
)
所有的东西都准备好了,我们应该怎样在java中调用呢? 如果想调用这个存储过程,首先必须要让java程序知道我们定义的oracle对象到底是什么样的,我们定义的oracle数组到底是什么样的.下面的方法可以做到:
STRTYPE是我们前面在oracle定义的对象类型,同样ARRTAB是oracle数组的类型.接下来我们便可以便用pDesc, aDesc来创建传递给oracle的java对象与数组了:
Ok.大功告成.
oracle的jdbc driver扩展了很多标准的api,有兴趣的可以在这里看到:
http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/overvw.htm
1 CREATE OR REPLACE
2 TYPE STRTYPE AS OBJECT(col1 varchar2(100), col2 varchar2(200))
2 TYPE STRTYPE AS OBJECT(col1 varchar2(100), col2 varchar2(200))
我们定义了一个oracle自定义的类型,然后在声明一个这种类型的数组:
CREATE OR REPLACE
TYPE ARRTAB AS TABLE OF STRTYPE
/
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
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);
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();
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
浙公网安备 33010602011771号