xmu*_*obi 28 java oracle stored-procedures jdbc
I have the following stored procedure:
procedure getInfo ( p_ids IN IDS_TABLE, p_details OUT cursor )
Run Code Online (Sandbox Code Playgroud)
Type IDS_TABLE is:
create or replace type IDS_TABLE as table of IDS
create or replace type IDS as object ( id1 NUMBER, id2 NUMBER, id3 NUMBER )
Run Code Online (Sandbox Code Playgroud)
How can I call getInfo in Java?
Vin*_*rat 39
手动设置Oracle SQL对象和Java对象之间的链接并非易事.特别是,用户定义对象的数组(或嵌套表)比标准数据类型的数组从Java传递到Oracle更复杂.换句话说,使用签名调用过程更容易:
(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`
Run Code Online (Sandbox Code Playgroud)
比签名为的程序:
(TABLE OF (NUMBER, NUMBER, NUMBER)) <- your case
Run Code Online (Sandbox Code Playgroud)
您可以在程序周围编写一个包装器,将第二种情况转换为第一种情况.
话虽这么说,映射你的程序到目前为止并非不可能.以下示例主要受Tom Kyte的帖子启发.Tom描述了如何映射TABLE OF NUMBER使用oracle.sql.ARRAY.在您的情况下,我们还必须使用oracle.sql.STRUCT映射IDSSQL对象.
您可能还想浏览Oracle JDBC文档,特别是" 使用Oracle对象类型 "一章.
首先是类似于你的设置:
SQL> CREATE OR REPLACE TYPE IDS AS OBJECT ( id1 NUMBER, id2 NUMBER, id3 NUMBER );
2 /
Type created
SQL> CREATE OR REPLACE TYPE IDS_TABLE AS TABLE OF IDS;
2 /
Type created
SQL> CREATE OR REPLACE PROCEDURE getInfo(p_ids IN IDS_TABLE) IS
2 BEGIN
3 FOR i IN 1 .. p_ids.COUNT LOOP
4 dbms_output.put_line(p_ids(i).id1
5 || ',' || p_ids(i).id2
6 || ',' || p_ids(i).id3);
7 END LOOP;
8 END getInfo;
9 /
Procedure created
Run Code Online (Sandbox Code Playgroud)
这是java程序:
SQL> CREATE OR REPLACE
2 AND COMPILE JAVA SOURCE NAMED "ArrayDemo"
3 as
4 import java.io.*;
5 import java.sql.*;
6 import oracle.sql.*;
7 import oracle.jdbc.driver.*;
8
9 public class ArrayDemo {
10
11 public static void passArray() throws SQLException {
12
13 Connection conn =
14 new OracleDriver().defaultConnection();
15
16
17 StructDescriptor itemDescriptor =
18 StructDescriptor.createDescriptor("IDS",conn);
19
20 Object[] itemAtributes = new Object[] {new Integer(1),
21 new Integer(2),
22 new Integer(3)};
23 STRUCT itemObject1 = new STRUCT(itemDescriptor,conn,itemAtributes);
24
25 itemAtributes = new Object[] {new Integer(4),
26 new Integer(5),
27 new Integer(6)};
28 STRUCT itemObject2 = new STRUCT(itemDescriptor,conn,itemAtributes);
29
30 STRUCT[] idsArray = {itemObject1,itemObject2};
31
32 ArrayDescriptor descriptor =
33 ArrayDescriptor.createDescriptor( "IDS_TABLE", conn );
34
35 ARRAY array_to_pass =
36 new ARRAY( descriptor, conn, idsArray );
37
38 OraclePreparedStatement ps =
39 (OraclePreparedStatement)conn.prepareStatement
40 ( "begin getInfo(:x); end;" );
41
42 ps.setARRAY( 1, array_to_pass );
43 ps.execute();
44
45 }
46 }
47 /
Java created
Run Code Online (Sandbox Code Playgroud)
我们称之为:
SQL> CREATE OR REPLACE
2 PROCEDURE show_java_calling_plsql
3 AS LANGUAGE JAVA
4 NAME 'ArrayDemo.passArray()';
5 /
Procedure created
SQL> exec show_java_calling_plsql ;
1,2,3
4,5,6
PL/SQL procedure successfully completed
Run Code Online (Sandbox Code Playgroud)