Вызовите объектно-ориентированные процедуры-члены Oracle PL / SQL из JDBC - PullRequest
8 голосов
/ 21 августа 2011

В объектно-ориентированном 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;

Как я могу сделать это с CallableStatement JDBC?Кажется, я не могу легко найти это в документации.

ПРИМЕЧАНИЕ : Это одна возможность, заключающая в себе конструктор типа:

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

Но что я?m ищет что-то вроде этого (используя java.sql.SQLData в качестве параметра):

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

Кроме того, функции-члены, процедуры могут изменять объект.Как я могу получить измененный объект обратно в Java?

1 Ответ

4 голосов
/ 22 августа 2011

В jdbc вы можете анализировать и выполнять блоки PL / SQL с out переменными. Вы можете подготовить вызываемое заявление, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...