如何将 java 对象传递给 oracle 存储过程,详细信息如下
Posted
技术标签:
【中文标题】如何将 java 对象传递给 oracle 存储过程,详细信息如下【英文标题】:how to pass a java object to oracle stored procedure with following details 【发布时间】:2012-06-04 08:24:39 【问题描述】:我的 ORACLE 表的结构为
desc extraction_log1
Name Null
Type
------------------------------ -------- ------------------------------------------------------------ ---------------------------------------------------------------------------------------------------- -----------------------------
ROW_NUM NOT NULL NUMBER
DATE_TIME TIMESTAMP(8)
USER_NAME VARCHAR2(32)
PLATFORM_NAME VARCHAR2(20)
R_OBJECT_ID VARCHAR2(16)
然后我在 oracle 中创建了一个对象类型为
create or replace type EXTRACTION_LOG_TYPE as object (
USER_NAME VARCHAR2(32),
R_OBJECT_ID VARCHAR2(16),
);
然后我在一个包中创建了一个过程
create or replace package body PAC_BEAN is
--The insert procedure will receive EXTRACTION_LOG_TYPE and put it into table EXTRACTION_LOG1.
procedure PRO_INSERT_LOG(ELT in EXTRACTION_LOG_TYPE) is
begin
insert into EXTRACTION_LOG1 ( R_OBJECT_ID, USER_NAME)
values (ELT.R_OBJECT_ID, ELT.USER_NAME);
commit;
exception
when others then
rollback;
end PRO_INSERT_LOG;
end PAC_BEAN;
来到我的java端,我已经声明了一个bean
public class ExtractionLogType
//Name declared in Oracle
public static final String ORACLE_OBJECT_NAME = "EXTRACTION_LOG_TYPE";
//The attributes
private String R_OBJECT_ID;
private String USER_NAME;
//setters and getters
public String getR_OBJECT_ID()
return R_OBJECT_ID;
public void setR_OBJECT_ID(String rOBJECTID)
R_OBJECT_ID = rOBJECTID;
public String getUSER_NAME()
return USER_NAME;
public void setUSER_NAME(String uSERNAME)
USER_NAME = uSERNAME;
在我的包含 main 的类中
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBLogger
String dbUrl;
Connection con;
//constructor for creation of connection object
as and when an object of DBLogger is instantiated
public DBLogger()
dbUrl = "jdbc:oracle:thin@my url";
try
//load Oracle Driver class
Class.forName("oracle.jdbc.driver.OracleDriver");
catch (ClassNotFoundException e)
e.printStackTrace();
System.err.println("Oracle driver class not found");
try
//instantiate connection object
con = DriverManager.getConnectio (dbUrl,"userId","pwd");
catch (SQLException e)
e.printStackTrace();
System.err.println("Connection object to oracle cant be established");
public static void main(String args[])
try
DBLogger db=new DBLogger();
CallableStatement cs = null;
ExtractionLogType elt=new ExtractionLogType();
elt.setR_OBJECT_ID("79479479A900");
elt.setUSER_NAME("Jeevan");
cs = db.con.prepareCall("call PAC_BEAN.PRO_INSERT_LOG(?)");
/*
* *code to insert the above object into our Database
*
*/
cs.execute();
System.out.println("insert procedure executed successfully");
db.con.close();
//end try
catch (SQLException e)
e.printStackTrace();
catch(Exception e) e.printStackTrace();
我想不出将对象插入我的数据库的代码。 任何人都可以就此向我提出建议。
谢谢。
【问题讨论】:
【参考方案1】:你必须为你的数据库类型定义一个数组描述符,这个例子可以帮助你:
final ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("EXTRACTION_LOG_TYPE", con);
// create an Object Array
Object[] data = new Object[2];
// set the values in order of appearance
data[0] = elt.getUSER_NAME();
data[1] = elt.getR_OBJECT_ID();
// Create the Array
ARRAY array = new ARRAY(descriptor, con, data);
// put it on your statement
cs.setArray(1, array);
// execute ...
【讨论】:
获取错误为“无法构造描述符:无法解析类型:“SYSTEM.EXTRACTION_LOG_TYPE”“ 我的数据库中有这个但抛出了这个异常。 @Jeevan 类型 EXTRACTION_LOG_TYPE 是模式 SYSTEM 的一部分吗?你在哪里创建类型?在一个包里? @Jeevan 可能适用于 ArrayDescriptor.createDescriptor("SYSTEM.EXTRACTION_LOG_TYPE", con); 运气不好。还是一样的例外【参考方案2】:在数据库的 SYSTEM 模式中创建任何对象是一个糟糕的主意。将您的应用程序直接连接到此方案也是同样的坏主意。 这看起来像是缺乏特权,不允许您获得想要的东西。创建新模式,此模式的专用用户,然后使用此新用户创建所有必需的对象(它将是您的对象的所有者)。通过这种方式,您可以避免“问题”,即您无法访问您应该可以访问的内容。
【讨论】:
以上是关于如何将 java 对象传递给 oracle 存储过程,详细信息如下的主要内容,如果未能解决你的问题,请参考以下文章
使用简单的 jdbc 调用将数组作为输入参数传递给 oracle 存储过程
将 LoginContext 作为凭据传递给 JCR(java 内容存储库)中的存储库登录
如何将具有多个对象的状态数组作为参数传递给graphql突变?