Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ExecuteStoredProcedure抛出错误代码17004_Java_Oracle_Jdbc - Fatal编程技术网

Java ExecuteStoredProcedure抛出错误代码17004

Java ExecuteStoredProcedure抛出错误代码17004,java,oracle,jdbc,Java,Oracle,Jdbc,我正在使用这些库 import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor; 这个班呢 CallableStatementCreatorFactory 详细例外 Root Cause: [org.springframework.jdbc.UncategorizedSQLEx

我正在使用这些库

import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
这个班呢

CallableStatementCreatorFactory  
详细例外

Root Cause: [org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{? = call xxxxxxxxxxxx()}]; SQL state [99999]; error code [17004]; Invalid coloumn: 16; nested exception is java.sql.SQLException: Invalid coloumn: 16]</faultstring>

Map<String, Object> result = QueryExecutor.getInstance().executeStoredProcedure("XXX", null);
根本原因:[org.springframework.jdbc.UncategorizedSQLException:CallableStatementCallback;SQL[{?=call xxxxxxxxxxx()}]的未分类SQLException;SQL状态[99999];错误代码[17004];无效列:16;嵌套异常为java.SQL.SQLException:无效列:16]
映射结果=QueryExecutor.getInstance().executeStoredProcedure(“XXX”,null);

不理解出现此错误的主要原因?

检查数据类型之间是否不匹配,并确保没有空值或约束。

您的函数似乎返回了一个
布尔值。这个

以下类复制了类似的错误:

import java.sql.*;
import oracle.jdbc.OracleTypes;

public class Error17004Test {
    public static void main(String[] args) throws Exception {
        try (Connection c = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521:XE", "user", "password")) {

            try (Statement stmt = c.createStatement()) {
                stmt.execute(
                    "CREATE OR REPLACE FUNCTION bool_test RETURN BOOLEAN " +
                    "AS BEGIN RETURN TRUE; END;");
            }

            try (CallableStatement cstmt = c.prepareCall("{ ? = call bool_test }")) {
                cstmt.registerOutParameter(1, OracleTypes.BOOLEAN);
                cstmt.execute();
                System.out.println("Got result of " + cstmt.getObject(1));
            }
        }
        catch (SQLException e) {
            System.out.println("Got a SQLException with message '" + e.getMessage() +
                    "' and error code " + e.getErrorCode());
        }
    }
}
当我运行此命令时,会得到以下输出:

获取了一个SQLException,消息为“无效列类型:16”,错误代码为17004
幸运的是,有一个简单的解决方法:将函数包装在对
sys.diutil.bool\u to\u int
的调用中
sys.diutil.bool\u to_int
布尔值
TRUE
FALSE
NULL
分别转换为
1
0
NULL
。然后只需从存储过程调用中读取整数值,而不是布尔值。当然,然后必须在返回的整数值和可能需要的布尔值之间进行转换,但这应该很简单

如果我把我的课改成上面的两行

            try (CallableStatement cstmt = c.prepareCall("{ ? = call bool_test }")) {
                cstmt.registerOutParameter(1, OracleTypes.BOOLEAN);

然后再次运行我的类,我得到以下输出:

获得了1的结果

相反。

请显示存储过程。我应该在哪里看到不匹配?在我的存储过程或调用方法中?*我们还知道其他plSql正在您的调用方法中工作。您是否在程序中添加了一些参数?还要检查该过程是否没有返回任何空值。谢谢您的帮助。该过程正在返回布尔值。由于Column错误无效,我考虑了数据库中的数据类型和一些约束。但是有了新的信息,它就没有任何意义了:)你有新的想法吗?出了什么问题?
            try (CallableStatement cstmt = c.prepareCall(
                    "{ ? = call sys.diutil.bool_to_int(bool_test) }")) {
                cstmt.registerOutParameter(1, Types.INTEGER);