【发布时间】:2014-12-11 22:46:54
【问题描述】:
我正在尝试调用一个PL/SQL 过程,该过程为其某些参数定义了默认值。我在JDBC 中使用CallableStatement 来执行此操作。
此过程有大量参数定义了默认值。我不想在 Java 代码中显式设置默认值。这样做会使代码的维护变得更加困难。如果 PL/SQL 代码发生变化,Java 代码也必须进行相同的更改。
是否可以在 JDBC 中完成此操作?例如,只需将值绑定到您感兴趣的参数,而忽略其余的。
我在以下示例过程中尝试过:
-- PURPOSE: Takes a parameter which has defaults set. Returns the value of the same parameter
-- Example of: FUNCTION that takes a parameter with DEFAULT values
FUNCTION handle_defaults(empId IN NUMBER DEFAULT 20 , empCity IN VARCHAR2) RETURN NUMBER IS
BEGIN
RETURN empId;
EXCEPTION
WHEN others THEN
dbms_output.put_line('Error!');
END handle_defaults;
以下是代码的相关部分(注意:为了可读性,已剥离 try catch 块、清理数据库资源等)
// Create a database connection
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD);
// Create a query string
String queryStr = "{ ? = call HR.EMP_PKG.handle_defaults( ? , ? ) }";
// Create a Callable Statements
callStmt = conn.prepareCall(queryStr);
// Bind values to the IN parameter
callStmt.setString(3, "Mumbai");
// Register OUT parameter
callStmt.registerOutParameter(1, java.sql.Types.NUMERIC);
// Execute the Callable Statement
callStmt.execute();
// Retrieve the value of the OUT parameter
parameterValue = callStmt.getInt(1);
System.out.println("Value returned : " + parameterValue);
我收到以下错误:
Exception occured in the database
java.sql.SQLException: Missing IN or OUT parameter at index:: 2
Database error code: 17041
作为绝望的尝试,我还尝试为这些参数传递 Null。只包含以下行:
callStmt.setNull(2, java.sql.Types.NUMERIC);
我得到以下结果:
Value returned : 0
这是有道理的 bcoz setNull 将 SQL Null 提供给参数。
我正在使用Oracle 11g 和Oracle 12c Jdbc Driver Version 12.1.0.2。
【问题讨论】:
标签: java jdbc data-binding parameters default