相关疑难解决方法(0)

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

在面向对象的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;
Run Code Online (Sandbox Code Playgroud)

来自: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;
Run Code Online (Sandbox Code Playgroud)

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

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

CallableStatement call = c.prepareCall(
    " { ? = call …
Run Code Online (Sandbox Code Playgroud)

oop oracle plsql stored-procedures jdbc

8
推荐指数
1
解决办法
3395
查看次数

使用JPA 2.1/Hibernate 4将值列表传递给存储过程

我有一个存储过程,它接受一个字符串列表(并遵循存储过程的限制,根据Hibernate文档):

PROCEDURE count_active_esc(p_count OUT NUMBER, p_codes IN string_list);
Run Code Online (Sandbox Code Playgroud)

string_list自定义类型在哪里:

CREATE OR REPLACE TYPE string_list IS TABLE OF VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

并希望从JPA实体管理器(JPA 2.1中的新功能)中调用它.

我试图使用一个数组:

StoredProcedreQuery query = entityManager.createNamedStoredProcedureQuery("count_active_esc");
query.registerStoredProcedureParameter("p_count", Integer.class, ParameterMode.OUT);
query.registerStoredProcedureParameter("p_codes", String[].class, ParameterMode.IN);
query.setParameter("p_codes", new String[] { "AEST" });

query.getOutputParameterValue("p_count"); // <<<<< throws an exception
Run Code Online (Sandbox Code Playgroud)

并得到一个例外:

    PLS-00306: wrong number or types of arguments in call to 'COUNT_ACTIVE_ESC'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)

如果我传入一个列表:

StoredProcedreQuery query = entityManager.createNamedStoredProcedureQuery("count_active_esc");
query.registerStoredProcedureParameter("p_count", Integer.class, ParameterMode.OUT);
query.registerStoredProcedureParameter("p_codes", List.class, …
Run Code Online (Sandbox Code Playgroud)

java oracle hibernate jpa

7
推荐指数
1
解决办法
7716
查看次数

从存储过程返回的STRUCT中读取ARRAY

在数据库中有三种Oracle自定义类型(简化)如下:

create or replace TYPE T_ENCLOSURE AS OBJECT(
  ENCLOSURE_ID      NUMBER(32,0),
  ENCLOSURE_NAME    VARCHAR2(255 BYTE),
  ANIMALS           T_ARRAY_ANIMALS,

  MEMBER FUNCTION   CHECK_IF_RED RETURN BOOLEAN
);


create or replace TYPE T_ARRAY_ANIMALS is TABLE OF T_ANIMAL;


create or replace TYPE T_ANIMAL AS OBJECT(
  ANIMAL_ID NUMBER(32,0),
  NUMBER_OF_HAIRS NUMBER(32,0)
);
Run Code Online (Sandbox Code Playgroud)

和一个构建对象树的函数

FUNCTION GET_ENCLOSURE ( f_enclosure_id zoo_schema.ENCLOSURE_TABLE.ENCLOSURE_ID%TYPE ) RETURN T_ENCLOSURE
AS
    v_ENC T_ENCLOSURE;
    v_idx pls_integer;

BEGIN

    v_ENC := T_ENCLOSURE(
        f_enclosure_id,
        NULL,
        T_ARRAY_ANIMALS(T_ANIMAL(NULL,NULL))
    );

    SELECT ENCLOSURE_NAME
    INTO   v_ENC.ENCLOSURE_NAME
    FROM   ENCLOSURE_TABLE WHERE ENCLOSURE_ID = f_ENCLOSURE_ID;

    SELECT
        CAST(MULTISET(
            SELECT ANIMAL_ID, NUMBER_OF_HAIRS
            FROM …
Run Code Online (Sandbox Code Playgroud)

java oracle jdbc

6
推荐指数
1
解决办法
4244
查看次数

如何防止此异常?java.sql.SQLException:无法转换为内部表示:

我的代码在以下行中引发了上述异常(第2行):

final ArrayDescriptor tParamArrayDescriptor = ArrayDescriptor.createDescriptor("MY_SYSTEM.T_PARAM_ARRAY", databaseHandler.getConnection());
final ARRAY oracleArray = new ARRAY(tParamArrayDescriptor, databaseHandler.getConnection(), myObjects.toArray());
Run Code Online (Sandbox Code Playgroud)

它给了我以下例外:

java.sql.SQLException: Fail to convert to internal representation: 
Run Code Online (Sandbox Code Playgroud)

myObjects是以下POJO的ArrayList:

public class MyObject
{
    private String name;
    private String surname;

    private int age;

    ...

    // Accessors etc..

}
Run Code Online (Sandbox Code Playgroud)

T_PARAM_ARRAY数据库上看起来如下:

create or replace
TYPE               T_PARAM_ARRAY AS OBJECT (NAME VARCHAR2(50), SURNAME VARCHAR2(50), AGE NUMBER(1));
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我认为我的POJO和数据库类型之间的数据类型映射不能正确匹配.我有理由相信String匹配到VARCHAR2确定,但我认为转换int为a时存在问题NUMBER.

我尝试过使用BigDecimal,但这并没有改善这种情况.

有什么建议?

编辑:根据Oracle文档:Where intArray is an oracle.sql.ARRAY, corresponding to a VARRAY of …

java oracle sqlexception

5
推荐指数
1
解决办法
1万
查看次数

无法转换为内部表示(oracle.sql.ARRAY)

我想转换我的Object[] Arrayin oracle.sql.ARRAY,所以我可以将它插入到我的 Oracle 数据库 (12c) 中。

public class Datatransfer{

  public static void main(String[] args) throws SQLException, ClassNotFoundException{

    Connection accessConn = null;
    Connection oracleConn = null;
    Statement stmt = null;
    ResultSet rs = null;
    String mySelectSQL = "Select * from Supplier";

    try{
        oracleConn = DBConnection.connOracle();
        accessConn = DBConnection.connAccess();
        stmt = accessConn.createStatement();
        rs = stmt.executeQuery(mySelectSQL);

        while(rs.next()){
           do_something...

           Object[] addressArray = {rs.getString("Street"),
                                   rs.getString("Location"),
                                   rs.getString("Region"),
                                   rs.getString("Postcode"),
                                   rs.getString("Country")};
           oracle.sql.ARRAY myAddressArray =
                        ((oracle.jdbc.OracleConnection)oracleConn).
                        createARRAY("ADDRESS_ARRAY", addressArray);

        do_something...

    }
    catch(SQLException | ClassNotFoundException e)
    {e.printStrackTrace();} …
Run Code Online (Sandbox Code Playgroud)

java oracle12c

5
推荐指数
0
解决办法
2961
查看次数

标签 统计

java ×4

oracle ×4

jdbc ×2

hibernate ×1

jpa ×1

oop ×1

oracle12c ×1

plsql ×1

sqlexception ×1

stored-procedures ×1