如何在Java中调用包含用户定义类型的Oracle存储过程?

如何在Java中调用包含用户定义类型的Oracle存储过程?,第1张

如何在Java中调用包含用户定义类型的Oracle存储过程

手动设置Oracle SQL对象和java对象之间的链接不是一件容易的事。特别是,从用户定义对象的数组(或嵌套表)到Java到Oracle的传递比标准数据类型的数组更复杂。换句话说,调用带有签名的过程会更容易:

(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`

而不是签名为:

(TABLE OF (NUMBER, NUMBER, NUMBER))   <- your case

你可以在过程周​​围编写包装器,以将第二种情况转换为第一种情况。

话虽如此,映射你的程序到目前为止并非没有可能。以下示例在很大程度上受到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 createdSQL> CREATE OR REPLACE TYPE IDS_TABLE AS TABLE OF IDS;  2  /Type createdSQL> 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

这是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 = 14new OracleDriver().defaultConnection(); 15   16   17        StructDescriptor itemDescriptor = 18StructDescriptor.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 = 33ArrayDescriptor.createDescriptor( "IDS_TABLE", conn ); 34   35        ARRAY array_to_pass = 36new 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

我们称之为:

SQL> CREATE OR REPLACE  2  PROCEDURE show_java_calling_plsql  3  AS LANGUAGE JAVA  4  NAME 'ArrayDemo.passArray()';  5  /Procedure createdSQL> exec show_java_calling_plsql ;1,2,34,5,6PL/SQL procedure successfully completed


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5432171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存