在面向对象的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) 我有一个存储过程,它接受一个字符串列表(并遵循存储过程的限制,根据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) 在数据库中有三种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) 我的代码在以下行中引发了上述异常(第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 …
我想转换我的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)