当前位置: 首页 > 面试题库 >

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

谢豪
2023-03-14
问题内容

在Oracle DB中:

我有以下存储过程

procedure getInfo ( p_ids IN IDS_TABLE, p_details OUT cursor )

类型IDS_TABLE是:

create or replace type IDS_TABLE as table of IDS    

create or replace type IDS as object ( id1 NUMBER, id2 NUMBER, id3 NUMBER )

如何在Java中调用getInfo?


问题答案:

手动设置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 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

这是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

我们称之为:

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


 类似资料:
  • 问题内容: 我有一个plsql程序 我尝试在Java代码中调用它。我已经使用其他过程执行了所有参数均为VARCHAR类型的过程,但是这里所有参数都是“ bd_tb_struct” 我也有一个带有此Comment的Java类。“数据库中对应类型的类。(bd_tb_struct)” 有人可以解释一下我该如何称呼我的程序吗? 问题答案: Oracle安装程序 : Java SQLData类 : 从Jav

  • 我在Oracle中有一个存储过程,如下所示。 我正在从Java调用该过程。我的密码是, 即使我正在获取记录,值也是空的。这意味着如果输出为2行,则while条件执行并打印为空。在SQL Developer中,它工作得很好。提前道谢。

  • 我是Oracle的初学者,我声明了这个对象类型: 我希望在我的存储过程中使用该对象: 但是当编译过程时,我得到了这个错误: 错误(2,14):PLS-00201:必须声明标识符“T1” 我怎样才能写出正确的程序?谢谢大家。

  • 我正在尝试创建这个存储过程,它应该将客户编号和电子邮件地址作为输入。然后更新该客户的电子邮件地址。如果新的电子邮件地址与旧的相同,则应提出异常。 但它是抛出错误。不确定我是否做得对。我正在使用最新的OracleSQLDeveloper。 错误(6,1): PLS-00103:在需要以下内容之一时遇到符号“DECLARE ”: begin function pragma procedure subt

  • 下面是我的Oracle存储过程, 我得到以下异常:hibernate:{CALL REPORT_HIBERNATE(?)}org.hibernate.exception.GenericJDBcException:无法执行查询...并且由:java.sql.sqlException:无效的列索引引起 Plz让我知道在Spring中我将如何使用Hibernate注释调用这个存储过程??

  • 问题内容: 编辑:虽然此问题中的某些答案可能会帮助其他人解决不同的问题,但该解决方案实际上与数据库连接上的自动提交功能中的某些错误有关! 执行查询后强制执行提交会使数据库反映更改,因此下面显示的代码是调用此类型存储过程的正确方法 我正在尝试在oracle数据库中调用一个简单的存储过程。 该过程如下所示: 我遇到麻烦的Java代码如下所示 我根本没有收到任何错误,但是没有反映出数据库更改。当我在SQ