【问题标题】:Pass oracle object type to java stored procedure将 oracle 对象类型传递给 java 存储过程
【发布时间】:2017-06-08 08:26:16
【问题描述】:

可以将 oracle 对象类型传递给 java 存储过程。这是我目前所拥有的。

Java 存储过程:

create or replace and compile java source named Example as
import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

public class Example {
    
    public static void test(ExObj obj) {
        System.out.println(obj.client);
    }
    
    public static class ExObj implements SQLData {

        public String client = "";

        public String sql_type = "EXAMPLE_OBJECT";

        public ExObj(String client, String sql_type) {
            this.client = client;

            this.sql_type = sql_type;
        }

        /* IMPLEMENTS SQLData */

        public void setSqlType(String sqlType) {
            sql_type = sqlType;
        }

        public void writeSQL(SQLOutput stream) throws SQLException {
            stream.writeString(this.client);
        }

        public String getSQLTypeName() {
            return sql_type;
        }

        public void readSQL(SQLInput stream, String sqlTypeName) throws SQLException {
            sql_type = sqlTypeName;

            this.client = stream.readString();
        }

    }
}

Oracle 程序:

CREATE OR REPLACE PROCEDURE example(ex_obj in example_object)
AS LANGUAGE JAVA
NAME 'Example.test(java.sql.Struct)';

Oracle 对象类型:

create or replace type example_object as object(
  client varchar2(40)
)

调用程序的脚本:

declare
  l_output DBMS_OUTPUT.chararr;
  l_lines  INTEGER := 1000;
  
  l_obj example_object;
begin
  DBMS_OUTPUT.enable(1000000);
  DBMS_JAVA.set_output(1000000);
  
  l_obj := example_object('client');
  example(l_obj);

  DBMS_OUTPUT.get_lines(l_output, l_lines);

  FOR i IN 1 .. l_lines LOOP
    -- Do something with the line.
    -- Data in the collection - l_output(i)
    DBMS_OUTPUT.put_line(l_output(i));
  END LOOP;
end;

运行脚本时我得到:

ORA-29531:类示例中没有方法测试

ORA-06512:在“示例”第 1 行

ORA-06512:第 17 行

我认为这是因为 oracle object_type 没有正确映射到 java 类。有没有办法做到这一点,如果有,我做错了什么?

【问题讨论】:

  • 当SQL对象只有一个字段时,你的ExObj构造函数真的应该有两个参数吗?你为什么要将sqlType 传递给构造函数——这应该是常量吗?
  • 是的,它应该在那里,它应该将 java 类映射到 oracle 对象类型。当我将 java 类返回到 oracle 时,它​​可以工作,f.e.公共静态 ExObj test1(String str) {return new ExObj(str);}。所以我假设它在将对象类型传递给 java 时也应该工作。

标签: java oracle stored-procedures oracle11g


【解决方案1】:

下面提到的代码问题可能是原因。

1) 您必须声明 type 的变量 object 以便您可以使用它。您不能直接将object 用作datatype。见下文:

演示:

create or replace type example_object as object(
  client varchar2(40)
  );

 /

--Created a type of the object
create or replace type x is table of example_object;

/


 CREATE OR REPLACE PROCEDURE example(ex_obj in X)
    AS
  begin

    DBMS_OUTPUT.put_line('Example.test(java.sql.Struct');
    DBMS_OUTPUT.put_line('Inside the Procedure');
    DBMS_OUTPUT.put_line (ex_obj(1).client);

    end;
  /

    DECLARE
       l_output   DBMS_OUTPUT.chararr;
       l_lines    INTEGER := 1000;

       l_obj      x := x();      

    BEGIN
       DBMS_OUTPUT.enable (1000000);
       --DBMS_JAVA.set_output (1000000);

       --You need to mention the position where the record will be saved in table.
       l_obj.extend(); 
       l_obj(1) := example_object('client1');

       example (l_obj);

       DBMS_OUTPUT.put_line (l_obj(1).client);

       DBMS_OUTPUT.get_lines (l_output, l_lines);

       FOR i IN 1 .. l_lines
       LOOP
          -- Do something with the line.
          -- Data in the collection - l_output(i)
          DBMS_OUTPUT.put_line (l_output (i));
       END LOOP;
    END;

/

【讨论】:

  • 你是说我只能将一个数组传递给存储过程?
  • 不。我是说您需要先创建一种对象类型,然后将其用作数据类型。我创建了一种类型的对象作为关联数组并使用它。我也可以将它用作嵌套表,但这会给我带来一些额外的代码工作
  • 我已经更新了代码。看看你的代码和我的代码的区别。阅读内联 cmets 。不确定一个 Java 部分。但是您可以在 DB 部分进行更改并尝试一下
  • 现在你的第一个问题已经解决了。从 DB 端传递给 proc 的参数是正确的。请更改 java.sq.array 看看是否有效。
  • 你可以使用嵌套表的方法。它将是您的对象的表。我只是举了一个例子。两者都应该在 oracle 中工作..不确定它在 Java 中是如何工作的.. Google down.
猜你喜欢
  • 1970-01-01
  • 2012-06-04
  • 2010-11-02
  • 1970-01-01
  • 2019-12-03
  • 2015-01-02
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多