Fetch PL / SQL array возвращаемые значения в java
в Java как получить значения из pl/sql
функция, которая возвращает массив.
если моя функция pl/sql возвращает массив с именем myArray
, в java можно получить значения
от myArray
в объекты java с помощью callablestatement
?
спасибо
обновление 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();
обновление 2
private final String PRODECURE_NAME = "{? = call myfunc(?,?,?)}";
и
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);
функции
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);
Исправлено Обновление 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();
5 ответов
Я не делал этого с 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);
}
}
}
попробуйте этого человека и дайте мне тогда, как это сделать или нет.
EDIT:
эти char ? представляет один параметр, который вы установите (он называется параметризованным). Так вот:
cs.setYourType(2, <yourData>);
cs.setYourType(3, <yourData>);
cs.setYourType(4, <yourData>);
означает, что вы установили свои три параметра (?), первый параметр метод индекса столбца и второй вы данных определенного типа.
EDIT 2:
так жаль, что я написал плохое решение, уже обновлено, поэтому проверьте код сейчас и попробуйте.
myArray, возвращенный из PL / SQL, имеет тип java.язык SQL.Массив. Вы можете вызвать getArray() на нем и введите cast it, чтобы получить массив java.
String[] array = (String[]) myArray.getArray();
на спецификация JDBC содержится целый раздел (16.5), посвященный работе с массивами. Возможно, вы захотите взглянуть.
Я считаю, что вы можете использовать следующий метод, присутствующий в классе SerialArray, который является прямым потомком java.язык SQL.Массив:
Object getArray(Map<String, Class<?>> map)
здесь карта является держателем объекта и его свойства, которое должно быть сопоставлено с извлеченным набором результатов в возвращаемом массиве.
дополнительные сведения см. В разделе http://docs.oracle.com/javase/1.5.0/docs/api/javax/sql/rowset/serial/SerialArray.html javadoc