Jåc*_*cob 8 java oracle plsql jdbc
在Java中如何从pl/sql返回数组的函数中获取值.
如果我的pl/sql函数返回调用的数组myArray,在java中是否可以myArray使用callablestatement?从java对象获取值?
谢谢
更新1
我调用函数的Java代码,但是我得到了异常.
PLS-00306: wrong number or types of arguments in call to 'myfunc'
connection = con.getConnection();
callablestatement = connection.prepareCall("{call myfunc(?,?,?}");
callablestatement.setInt(1, param1);
callablestatement.setInt(2, param2);
callablestatement.setString(3, param3);
callablestatement.registerOutParameter(4, Types.ARRAY);
callablestatement.execute();
resultSet = callablestatement.getArray(4).getResultSet();
Run Code Online (Sandbox Code Playgroud)
更新2
private final String PRODECURE_NAME = "{? = call myfunc(?,?,?)}";
Run Code Online (Sandbox Code Playgroud)
和
connection = con.getConnection();
callablestatement = connection.prepareCall(PRODECURE_NAME);
callablestatement.registerOutParameter(1, Types.ARRAY);
callablestatement.setInt(2, param1);
callablestatement.setInt(3, param2);
callablestatement.setString(4, param3);
callablestatement.execute();
create or replace type dates
is varray(100) of varchar2(32);
Run Code Online (Sandbox Code Playgroud)
功能
CREATE OR REPLACE function myfunc (
p_id IN number,
p_c_id IN number,
p_co_no IN number
)
RETURN dates
AS
myarray contract_dates;
par1 VARCHAR2 (32);
par2 VARCHAR2 (32);
Run Code Online (Sandbox Code Playgroud)
修复了更新3
connection = con.getConnection();
callablestatement =
connection.prepareCall("begin ? :=myfunc(?,?,?); end;");
callablestatement.registerOutParameter(1, OracleTypes.ARRAY, "DATES");
callablestatement.setInt(2, param1);
callablestatement.setInt(3, param2);
callablestatement.setString(4, param3);
callablestatement.execute();
Run Code Online (Sandbox Code Playgroud)
我没有这样做,ARRAY但它应该有效。首先,您必须注册out函数的参数。所以可以是这样的。
private final String PRODECURE_NAME = "{? = call <ProcedureName>(?,?,?)}";
Connection con = null;
CallableStatement cs = null;
try {
con = DAOFactory.getDatabaseConnection();
cs = con.prepareCall(PRODECURE_NAME);
cs.registerOutParameter(1, java.sql.Types.ARRAY);
cs.setYourType(2, <yourData>);
cs.setYourType(3, <yourData>);
cs.setYourType(4, <yourData>);
cs.execute();
Array arr = cs.getArray(1);
if (arr != null) {
String[] data = (String[]) arr.getArray();
}
}
catch (SQLException ex) {
Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
try {
con.rollback();
}
}
finally {
if (con != null) {
try {
con.close();
}
catch (SQLException ex) {
Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
试试这个人,然后告诉我是否有效。
编辑:
这些字符?代表您将设置的一个参数(它被命名为参数化)。所以这:
cs.setYourType(2, <yourData>);
cs.setYourType(3, <yourData>);
cs.setYourType(4, <yourData>);
Run Code Online (Sandbox Code Playgroud)
意味着您设置了三个参数(?),方法的第一个参数是列索引,第二个参数是特定类型的数据。
编辑2:
很抱歉我写了错误的解决方案,已经更新了,所以现在检查代码并尝试一下。
| 归档时间: |
|
| 查看次数: |
15397 次 |
| 最近记录: |