将PL / SQL对象数组传递给JAVA存储过程

时间:2016-03-30 09:05:41

标签: java arrays oracle plsql

我正在努力实现看似简单的任务。

我在oracle中发现了一个非常有用的指南,演示了如何做某事 与我正在寻找的非常相似:https://docs.oracle.com/cd/F49540_01/DOC/java.815/a64686/04_call1.htm

此代码取自指南:

PL / SQL代码:

定义对象:

CREATE TYPE Employee AS OBJECT (
  empno    NUMBER(4),
  ename    VARCHAR2(10),
  job      VARCHAR2(9),
  mgr      NUMBER(4),
  hiredate DATE,
  sal      NUMBER(7,2),
  comm     NUMBER(7,2),
  deptno   REF Department
);

现在,创建将保存Employee类型对象的表对象:

CREATE TABLE emps OF Employee AS
SELECT Employee(e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal,
e.comm, (SELECT REF(d) FROM depts d WHERE d.deptno = e.deptno))
FROM emp e;

创建java存储过程:

CREATE OR REPLACE PROCEDURE raise_sal (e IN OUT Employee, r NUMBER)
AS LANGUAGE JAVA 
NAME 'Paymaster.raiseSal(Paymaster[], java.math.BigDecimal)';

现在,java类:

import java.sql.*;
import java.io.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
import oracle.oracore.*;
import oracle.jdbc2.*;
import java.math.*;

public class Paymaster implements SQLData {
  // Implement the attributes and operations for this type.
  private BigDecimal empno;
  private String ename;
  private String job;
  private BigDecimal mgr;
  private Date hiredate;
  private BigDecimal sal;
  private BigDecimal comm;
  private Ref dept;

  public static void raiseSal(Paymaster[] e, BigDecimal amount) {
    e[0].sal =               // IN OUT passes [0]
     e[0].sal.add(amount);  // increase salary by given amount
  }

到目前为止一切顺利。

我正在寻找的不是不仅向raiseSal发送一个结构,而是通过引用发送结构数组,因此我将能够迭代所有对象并使用它们。我想发送整个表并在java类中实时更改它。

我找了很长时间的解决方案,但我只找到了相反的解决方案:连接到PL / SQL存储过程并获取数组。我不希望在我的类中有任何数据库连接,因为许多DB将使用此类。它应该是便携式的。

甚至可能吗?

如果是这样的话,如果有一个如何用PL / SQL从表中调用 raiseSal 的例子,我会很高兴。

当浏览指南时,我看到 TABLE,VARRAY SQL类型具有相应的 oracle.sql.ARRAY,oracle.jdbc2.Array java类型。它可以用来解决我的问题吗?

感谢您的帮助!

0 个答案:

没有答案