我正在努力实现看似简单的任务。
我在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类型。它可以用来解决我的问题吗?
感谢您的帮助!