PL/SQL对象成员函数——java方法

Posted

技术标签:

【中文标题】PL/SQL对象成员函数——java方法【英文标题】:PL/SQL object member function - java method 【发布时间】:2015-04-11 16:08:57 【问题描述】:

我正在尝试制作一个成员函数调用 java 方法的 oracle 对象。它必须是成员函数,而不是静态函数。

Java 类:

Create or Replace Java Source Named "Hello" As
public class Hello 
  public String World()  return "Hello World!"; 

对象:

Create or replace type T_HelloW as object(
helloID int,
member function HelloWorld return varchar2 as
language java name 'Hello.World() return java.lang.String');

表创建和数据插入:

create table hellos of T_HelloW;
insert into hellos values(1);

但是当我尝试调用它时:

select h.HelloWorld() from hellos h;

我得到错误:

ORA-00932:不一致的数据类型:预期位置 1 处的 IN 参数是可转换为用户定义 Java 类实例的 Oracle 类型实例,但得到了无法转换为 Java 类的 Oracle 类型

    00000 - “不一致的数据类型:预期的 %s 得到了 %s”

*原因: *行动:

我有红色http://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABJJFJC 实际上,我发现的唯一信息。而且我看不出我错过了什么或做错了什么。

【问题讨论】:

这是我以前从未做过的事情,所以我不能给你正确的建议,但是你把文档读到底了吗?特别是the part about implementing SQLData? 我不是 100% 确定,但我认为这与问题无关。正如它所说 - 为了更自然地访问对象属性,请创建一个实现 SQLData 接口的 Java 类。在这种情况下,我什至不需要访问对象属性。 @SylvainLeroux 对不起,就是这样。虽然我不完全理解为什么我需要在这种情况下实现它。 @John - 请重新编辑您的问题。删除“解决方案”部分并将其作为答案发布。 *** 是一个问答网站;因此,它重视有答案的问题。发布并接受您自己问题的答案是完全合法的。 【参考方案1】:

解决方案正如 Sylvain Leroux 所建议的那样。必须实现 SQLData 接口:

Create or Replace Java Source Named "Hello" As

import java.sql.*;
import java.io.*;

public class Hello implements SQLData 
  private int helloId;
  public String World()  return "Hello World!"; 
  String sql_type;

  public String getSQLTypeName() throws SQLException 
    return sql_type;
  

  public void readSQL(SQLInput stream, String typeName) throws SQLException 
    sql_type = typeName;
    helloId = stream.readInt();
  

  public void writeSQL(SQLOutput stream) throws SQLException 
    stream.writeInt(helloId);
  

【讨论】:

但是如何返回嵌套对象?

以上是关于PL/SQL对象成员函数——java方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在返回 SELF 的 pl/sql 对象类型的函数中链接调用

通过Java对象来遍历成员方法,成员变量,构造函数

java中成员函数占用对象的内存空间吗

PL/SQL 包的概念及创建使用

Java面向对象:成员变量—OOP中的内存管理—构造函数

java之类的封装