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

Call Oracle object-oriented PL/SQL member procedures from JDBC(从 JDBC 调用 Oracle 面向对象的 PL/SQL 成员过程)
本文介绍了从 JDBC 调用 Oracle 面向对象的 PL/SQL 成员过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In object-oriented PL/SQL, I can add member procedures and functions to types. An example is given here:

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 中,我可以这样调用这些成员过程/函数:

In PL/SQL, I can then call these member procedures/functions like this:

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

如何使用 JDBC 的 CallableStatement 来实现?我似乎无法在文档中轻松找到它.

How can I do it with JDBC's CallableStatement? I can't seem to find this in the documentation easily.

注意:这是一种可能性,内联类型构造函数:

NOTE: This is one possibility, inlining the type constructor:

CallableStatement call = c.prepareCall(
    " { ? = call foo_type(5).func(2) } ");

但我正在寻找的是这样的东西(使用 java.sql.SQLData 作为参数):

But what I'm looking for is something like this (using java.sql.SQLData as a parameter):

CallableStatement call = c.prepareCall(
    " { ? = call ?.func(2) } ");

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

Also, member functions, procedures may modify the object. How can I get the modified object back in Java?

推荐答案

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

In jdbc you can parse and execute PL/SQL blocks with out variables. You could prepare a callable statement such as:

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

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

Then you can use CallableStatement.registerOutParameter and after the statement has been executed, use the appropriate get function to retrieve the value.

你可以直接在java中直接访问一个FOO_TYPE类型,但是你真的要这样做吗?请参阅下面的工作示例:

You can access directly a FOO_TYPE type directly in java, but do you really want to do this? See below for a working example:

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
"
 18              + "    x foo_type;
"
 19              + "begin
"
 20              + "    x := foo_type(5);
"
 21              + "    x.proc(10);
"
 22              + "    ? := x;
"
 23              + "end;
");
 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  /

这是一个测试类,用于展示如何在 SQL 对象上使用 registerOutParameter 方法,我们称之为:

This is a test class to show how you can use the method registerOutParameter on an SQL object, let's call it:

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

这篇关于从 JDBC 调用 Oracle 面向对象的 PL/SQL 成员过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

SQL to Generate Periodic Snapshots from Transactions Table(用于从事务表生成定期快照的SQL)
How to set up a WHILE loop with IF statement in MySQL?(如何在MySQL中用IF语句设置WHILE循环?)
MyBatis support for multiple databases(MyBatis支持多个数据库)
Oracle 12c SQL: Missing column Headers in result(Oracle 12c SQL:结果中缺少列标题)
SQL query to find the number of customers who shopped for 3 consecutive days in month of January 2020(查询2020年1月连续购物3天的客户数量)
How to get top 10 data weekly (This week, Previous week, Last month, 2 months ago, 3 month ago)(如何每周获取前十大数据(本周、前一周、上个月、2个月前、3个月前))