Имя именованного параметра Java (для результата функции JDBC Oracle) - PullRequest
4 голосов
/ 13 сентября 2010

Я собираюсь вызвать функцию и установить некоторые параметры по имени, например:

    Connection c = null;
    ResultSet rs = null;
    String query;
    PreparedStatement ps;
    CallableStatement cs = null;
    try {
        c = DbUtils.getConnection();
        cs = c.prepareCall("{? = call get_proc_name(?, ?) }");
        cs.registerOutParameter(1, OracleTypes.VARCHAR);
        cs.setInt("in_proc_type", ProcTypes.SELECT);
        cs.setLong("in_table_id", tableId);
        // here I should use something like cs.registerOutParameter("result", OracleTypes.VARCHAR);
        cs.execute();

Параметры функции PL / SQL:

CREATE OR REPLACE FUNCTION get_proc_name
(
  in_proc_type IN NUMBER, /*1 - insert, 2 - update, 3 - delete, 4 - select*/
  in_table_name IN VARCHAR2 := NULL,
  in_table_id IN NUMBER := NULL,
  in_table_type_id IN NUMBER := NULL,
  is_new IN NUMBER := 0
) RETURN VARCHAR2

Вопрос в том, какзарегистрировать результат как выходной параметр, а затем получить его из оракула в Java?Я могу зарегистрировать параметры входа / выхода по имени, потому что я знаю их имена из функции, но я не знаю, как получить результат функции, какое имя переменной использовать для нее.параметры с процедурами, а не функциями.

Версия Oracle: 11.1.0.6.0 Версия Java: 1.6.0_14

Ответы [ 3 ]

2 голосов
/ 13 сентября 2010

Решение состоит в том, чтобы использовать только индексы для параметров настройки.Такой код работает должным образом (смешение индексов и именованных параметров не работает; поэтому проблема использования именованного параметра для переменной результата не может быть решена, imho):

            c = DbUtils.getConnection();
            cs = c.prepareCall("{? = call get_proc_name(in_proc_type => ?, in_table_id => ?) }");
            cs.registerOutParameter(1, java.sql.Types.VARCHAR);
            cs.setInt(2, ProcTypes.SELECT);
            cs.setLong(3, tableId);
            cs.execute();
            String procName = cs.getString(1);
            cs.close();
1 голос
/ 13 сентября 2010

CallableStatement имеет набор registerXXX методов, которые принимают индекс.

Вот так вы регистрируете результат. Это параметр номер 1.

В вашем случае

cs.registerOutParameter( 1, java.sql.Types.VARCHAR);


Кстати, поскольку вы используете индекс для result, вам может потребоваться использовать индексированные setXXX методы и предоставить полный список параметров.

0 голосов
/ 13 сентября 2010

Вы регистрируете результат функции, как если бы это был первый параметр. Очевидно, это смещает нумерацию фактических параметров.

Ваша уже существующая линия

cs.registerOutParameter(1, OracleTypes.VARCHAR);

это все, что нужно. После звонка получи свой результат вот так:

String result = cs.getString(1);
...