oracle - 从 JDBC 调用 Oracle 面向对象的 PL/SQL 成员过程

标签 oracle oop stored-procedures jdbc plsql

在面向对象的 PL/SQL 中,我可以向类型添加成员过程和函数。这里给出了一个例子:

create type foo_type as object (
  foo number,

  member procedure proc(p in number),
  member function  func(p in number) return number
);

create type body foo_type as 
  member procedure proc(p in number) is begin
    foo := p*2;
  end proc;

  member function func(p in number) return number is begin
    return foo/p;
  end func;
end;

发件人:http://www.adp-gmbh.ch/ora/plsql/oo/member.html

在 PL/SQL 中,我可以像这样调用这些成员过程/函数:
declare
    x foo_type;
begin
    x := foo_type(5);
    x.proc(10);
    dbms_output.put_line(x.func(2));
end;

我怎样才能用 JDBC 的 CallableStatement 做到这一点?我似乎无法在文档中轻松找到它。

注意 :这是一种可能性,内联类型构造函数:
CallableStatement call = c.prepareCall(
    " { ? = call foo_type(5).func(2) } ");

但我正在寻找的是这样的(使用 java.sql.SQLData 作为参数):
CallableStatement call = c.prepareCall(
    " { ? = call ?.func(2) } ");

此外,成员函数、程序可能会修改对象。如何在 Java 中取回修改后的对象?

最佳答案

jdbc您可以使用 out 解析和执行 PL/SQL 块变量。您可以准备一个可调用的语句,例如:

declare
    x foo_type;
begin
    x := foo_type(5);
    x.proc(10);
    ? := x.func(2);
end;

那么你可以使用CallableStatement.registerOutParameter并在语句执行后,使用适当的 get函数来检索值。

您可以直接访问 FOO_TYPE直接在java中输入,但你真的要这样做吗?请参阅下面的工作示例:
SQL> create or replace and compile java source named "TestOutParam" as
  2  import java.sql.*;
  3  import oracle.sql.*;
  4  import oracle.jdbc.driver.*;
  5  
  6  public class TestOutParam {
  7  
  8     public static int get() throws SQLException {
  9  
 10        Connection conn =
 11           new OracleDriver().defaultConnection();
 12  
 13        StructDescriptor itemDescriptor =
 14           StructDescriptor.createDescriptor("FOO_TYPE",conn);
 15  
 16        OracleCallableStatement call =
 17           (OracleCallableStatement) conn.prepareCall("declare\n"
 18              + "    x foo_type;\n"
 19              + "begin\n"
 20              + "    x := foo_type(5);\n"
 21              + "    x.proc(10);\n"
 22              + "    ? := x;\n"
 23              + "end;\n");
 24  
 25        call.registerOutParameter(1, OracleTypes.STRUCT, "FOO_TYPE");
 26  
 27        call.execute();
 28  
 29        STRUCT myObj = call.getSTRUCT(1);
 30  
 31        Datum[] myData = myObj.getOracleAttributes();
 32  
 33        return myData[0].intValue();
 34  
 35     }
 36  }
 37  /

这是一个测试类,用于展示如何使用方法 registerOutParameter在 SQL 对象上,我们称之为:
SQL> CREATE OR REPLACE
  2  FUNCTION show_TestOutParam RETURN NUMBER
  3  AS LANGUAGE JAVA
  4  NAME 'TestOutParam.get() return java.lang.int';
  5  /

Function created

SQL> select show_testoutparam from dual;

SHOW_TESTOUTPARAM
-----------------
               20

关于oracle - 从 JDBC 调用 Oracle 面向对象的 PL/SQL 成员过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7137274/

相关文章:

oracle - 如何输出使用 native 动态SQL执行的SELECT语句的结果?

java - 如何为数据和索引指定单独的表空间?

python - 为什么猴子修补方法不传递对实例的引用?

sql - 使用单元测试项目进行CLR SQL存储过程测试

sql - 存储过程太慢

支持oracle TAF功能的java连接字符串

sql - Oracle SQL - 全部大写优先排序

oop - 抽象和封装之间的区别?

php - 在 PHP 中,是否可以在不调用类的构造函数的情况下创建类的实例?

mysql - #1064-sql 语法错误