Хранимая процедура Out Param через Java - PullRequest
1 голос
/ 22 декабря 2011

Я сохранил ниже proc:

CREATE OR REPLACE PROCEDURE "demo"."run_demo"(v_sql IN VARCHAR2, return_code OUT number)
AS

i number;

BEGIN
return_code := 0;
execute immediate v_sql;
i := sql%rowcount;

    IF (i<1)
    THEN return_code := 1;
END IF;

EXCEPTION  
    WHEN OTHERS THEN
    return_code := SQLCODE;
END;

Я пытаюсь вызвать его из Java, как показано ниже:

public static void main(String[] args) {
    try {
        Class.forName("oracle.jdbc.OracleDriver");      
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.10.10.10:1521:demo", "demo_app", "demo");

        CallableStatement cs = conn.prepareCall("{call demo.run_demo(?)}");
        cs.registerOutParameter(1, Types.INTEGER);
        cs.setString(1, "update demo.users set locale=''english'' where user_id = 2");

        cs.execute();

        System.out.println("out="+cs.getInt(1));
    } catch (Exception e) {         
        e.printStackTrace();
    }
}

Но возвращается ошибка

«Конфликт типа параметра».

Может ли кто-нибудь сказать мне, что не так?

Кроме того, как я могу вернуть дополнительную возвращаемую строку в хранимой процедуре, которая будет содержать сообщение об ошибке оракула (может быть краткое описание сообщения об ошибке)?

Спасибо!

1 Ответ

2 голосов
/ 22 декабря 2011

Вопрос @Alex van den Hoogen очень похож, но использует функцию, а не процедуру, которая, кажется, немного смутила вас. Суть та же; вы не передаете достаточно параметров в вызове Java - вы устанавливаете и получаете тот же позиционный параметр, номер 1. Вам нужно сделать что-то вроде:

CallableStatement cs = conn.prepareCall("{call demo.run_demo(?,?)}");
cs.setString(1, "update demo.users set locale=''english'' where user_id = 2");
cs.registerOutParameter(2, Types.INTEGER);

cs.execute();

System.out.println("out="+cs.getInt(2));

Так что в prepareCall, ?,? вместо просто ?; и 2 вместо 1 в registerOutParameter и getInt.

Или с обновленной процедурой из вашего более позднего вопроса , также получая сообщение об ошибке:

CallableStatement cs = conn.prepareCall("{call demo.run_demo(?,?,?)}");
cs.setString(1, "update demo.users set locale=''english'' where user_id = 2");
cs.registerOutParameter(2, Types.INTEGER);
cs.registerOutParameter(3, Types.VARCHAR);

cs.execute();

System.out.println("out="+cs.getInt(2) + ":" + cs.getString(3));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...