我得到了这个Oracle存储过程的代码,调用另一个存储过程,现在我的任务是用Java调用xyz_main。
PROCEDURE xyz_main (
i_param_a IN VARCHAR2 DEFAULT 'Y',
i_param_b IN PERSON.NAME%TYPE
i_param_c IN VARCHAR2 DEFAULT 'BLA'
o_return_msg OUT VARCHAR2
)
IS
...
BEGIN
...
END xyz_main;
PROCEDURE xyz_example (
i_param_b IN PERSON.NAME%TYPE DEFAULT 'Ben'
o_return_msg OUT VARCHAR2
)
IS
BEGIN
xyz_main(
i_param_b => i_param_b,
i_param_c => 'Great',
o_return_msg => o_return_msg
);
END xyz_example;
现在我的任务是用Java调用xyz_main。我写了这段代码。
// Using question mark because later on the values will be provided by function parameters
// Question: is "o_return_msg => ?" correct, even if I don't provide an input value?
String statement = "BEGIN xyz_main(i_param_b => ?, i_param_c => ?, o_return_msg => ?); END;";
try (Connection conn = getOraConnection();) {
CallableStatement cs = conn.prepareCall(statement);
// cs.setString("i_param_a", "Y"); -- omitted because the default value should be used always
cs.setString("i_param_b", "Ben");
cs.setString("i_param_c", "Great"); // should overwrite the default value
cs.registerOutParameter("o_return_msg", Types.VARCHAR);
cs.execute();
} catch (Exception e) {
...
}
运行这段代码,我得到了这个Exception:
ORA-06550: line 1, column 47:
PLS-00103: Fand das Symbol ">" als eines der folgenden erwartet wurde: ..
在英语中:
PLS-00103: Found Symbol ">" but expected one of this: ..
这段代码有什么问题?
我以为在使用命名参数时,总是要使用'par_name => ? 这是错误的。
写这样的代码是没有问题的。
//* don't work:
// String statement = "BEGIN xyz_main(i_param_b => ?, i_param_c => ?, o_return_msg => ?); END;"; // don't work
//* works:
String statement = "BEGIN xyz_main(?, ?, ?); END;";
try (Connection conn = getOraConnection();) {
CallableStatement cs = conn.prepareCall(statement);
// cs.setString("i_param_a", "Y"); -- omitted because the default value should be used always
cs.setString("i_param_b", "Ben");
cs.setString("i_param_c", "Great"); // should overwrite the default value
cs.registerOutParameter("o_return_msg", Types.VARCHAR);
cs.execute();
System.out.println(cs.getString("o_return_msg"));
cs.close();
} catch (Exception e) {
...
}