我想从java发送两个数组到oracle存储过程.第一个数组是字符串数组,第二个是字符数组,我该如何制作?
我使用下面的JDBC代码来调用一个带有Array输入的Oracle存储过程.
但是以下三个类已被弃用.如何更换?
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
Run Code Online (Sandbox Code Playgroud)
Java代码
Object[] reportArray = new Object[3];
STRUCT[] struct = new STRUCT[reports.size()];
ArrayDescriptor arrayDescriptor = new ArrayDescriptor(new SQLName("T_REPORT_TABLE", (OracleConnection) connection), connection);
StructDescriptor structDescriptor = StructDescriptor.createDescriptor("R_REPORT_OBJECT", connection);
int arrayIndex = 0;
for (Report data : reports) {
reportArray[0] = data.getXXX();
reportArray[1] = data.getYYY();
reportArray[2] = data.getZZZ();
struct[arrayIndex++] = new STRUCT(structDescriptor, connection, reportArray);
}
oracle.sql.ARRAY reportsArray = new oracle.sql.ARRAY(arrayDescriptor, connection, struct);
callableStatement.setArray("T_REPORT_IN", reportsArray);
callableStatement.executeUpdate();
Run Code Online (Sandbox Code Playgroud) 我试图通过createArrayOf将数组传递给我准备好的语句
val prep: PreparedStatement = con.prepareStatement("select * from SOA_WEB_USER.VOPEX where CMF_PPK_NBR in (?)")
val array :Array[Object]=Array("1165006001","1165006002")
val sqlArray = con.createArrayOf("VARCHAR",array) //getting the exception here
prep.setArray(1,sqlArray)
val rs = prep.executeQuery()
while (rs.next()) {
println(rs.getObject(1))
}
Run Code Online (Sandbox Code Playgroud)
但createArrayOf方法抛出一个错误说
Exception thread "main" java.sql.SQLFeatureNotSupportedException:Unsupported feature
at Oracle.jdbc.driver.PhysicalConnection.createArrayOf(PhysicalConnection.java:8707)
at com.testpackage.Main$.main(Main.scala:109)
at com.testpackage.Main.main(Main.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Run Code Online (Sandbox Code Playgroud)
我正在使用ojdbc7.jar进行jdbc连接.有什么我可以采取不同的方式将数组传递给准备好的语句吗?
从PL/SQL到Java来回传递数字和字符串没有问题,但是如何传递数组呢?我从PL/SQL调用Java - 而不是其他方式.
下面是一个get_widgets_as_string按预期工作的示例.如何编写PL/SQL 调用规范,so19j.get_widgets_as_array()以便我可以从PL/SQL调用它?
我已经阅读了发布带有调用规范的Java类,我可以看到嵌套表对应oracle.sql.ARRAY,但我无法使其工作.我可能错过了一些微不足道的细节,因为我不是Java程序员.
create or replace and compile java source named "so19j" as
import java.lang.*;
public class so19j {
public static String get_widgets_as_string() {
String widgets = "foo;bar;zoo";
return widgets;
}
public static String[] get_widgets_as_array() {
String[] widgets = new String[]{"foo", "bar", "zoo"};
return widgets;
}
};
/
show errors java source "so19j"
create or replace function get_widgets_as_string return varchar2 as
language java name 'so19j.get_widgets_as_string() return …Run Code Online (Sandbox Code Playgroud) 由于oracle.sql.ArrayDescriptor,oracle.sql.STRUCT和oracle.sql.StructDescriptor已弃用,我正在使用java.sql.Array和从 Java 调用 Oracle 存储过程java.sql.Struct。
我用这个问题作为参考
这是我的代码。
import java.sql.Array;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Struct;
import java.util.Map;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;
import oracle.jdbc.OracleTypes;
import oracle.jdbc.OracleConnection;
public CrearRelacionArbolResponseBean crearRelacionArbol(String mensajeTransaccion,
CrearRelacionArbolRequestBean request) throws DBException {
DataSource sgaDS;
CrearRelacionArbolResponseBean objResponse = new CrearRelacionArbolResponseBean();
Connection conn = null;
try {
InitialContext ctx = new InitialContext(); …Run Code Online (Sandbox Code Playgroud) java ×4
oracle ×4
arrays ×1
deprecated ×1
java-8 ×1
jdbc ×1
oracle11g ×1
oracle12c ×1
plsql ×1
scala ×1
spring-boot ×1
weblogic12c ×1