【问题标题】:SQLCODE: -3015 when calling stored procedureSQLCODE: -3015 调用存储过程时
【发布时间】:2016-06-21 03:15:25
【问题描述】:

我有一个存储过程如下:

CREATE OR REPLACE PROCEDURE "SMEADM"."COPY_TABLE_WITH_FILTER"
(IN IN_SOURCE_TABLE_NAME VARCHAR(50), IN IN_DEST_TABLE_NAME VARCHAR(50), IN IN_WHERE_CONDITION VARCHAR(1024))
NOT DETERMINISTIC
LANGUAGE SQL
SPECIFIC SQL_SME_DATA_RETENTION
BEGIN

  CALL SYSPROC.ADMIN_CMD('LOAD FROM (SELECT * FROM ' || IN_SOURCE_TABLE_NAME || ' WHERE ' || IN_WHERE_CONDITION || ' ) of cursor insert into ' || IN_DEST_TABLE_NAME || ' nonrecoverable');

END
@

这是我调用这个存储过程的java代码:

public void copyData(String srcTableName, String bakTableName, String dateColName, String sqlDateStr) 
{
    String sqlWhereFilter = " date(" + dateColName + ") < date('" + sqlDateStr + "')";

    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(this)
                .withSchemaName("SMEADM")
                .withProcedureName("COPY_TABLE_WITH_FILTER");

    SqlParameterSource in = new MapSqlParameterSource()
                                    .addValue("IN_SOURCE_TABLE_NAME", srcTableName)
                                    .addValue("IN_DEST_TABLE_NAME", bakTableName)
                                    .addValue( "IN_WHERE_CONDITION", sqlWhereFilter );

    jdbcCall.execute(in);
}

在我的本地环境、SIT 环境和 UAT 环境中一切正常。

但我在生产环境中得到了SqlException。下面是我的堆栈跟踪:

[16-06-17 00:13:30] com.cv.ibs.batch.dao.impl.DataRetentionDAOImpl DEBUG: | Calling stored procedure [{call SMEADM.COPY_TABLE_WITH_FILTER(?, ?, ?)}]
[16-06-17 00:13:31] org.springframework.batch.core.step.AbstractStep ERROR: | Encountered an error executing the step
org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call SMEADM.COPY_TABLE_WITH_FILTER(?, ?, ?)}]; SQL state [     ]; error code [-3015]; DB2 SQL error: SQLCODE: -3015, SQLSTATE:      , SQLERRMC: -551; nested exception is com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -3015, SQLSTATE:      , SQLERRMC: -551
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:969)
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1003)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:391)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:354)
    at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:181)
    at com.cv.ibs.batch.dao.impl.DataRetentionDAOImpl.copyData(DataRetentionDAOImpl.java:38)
    at com.cv.ibs.batch.job.tasklet.DataRetentionCopyOldDataTasklet.execute(DataRetentionCopyOldDataTasklet.java:41)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:386)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264)
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:76)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143)
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:250)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135)
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61)
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124)
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114)
    at com.cv.ibs.batch.job.DataRetentionJob.execute(DataRetentionJob.java:56)
    at com.cv.ibs.batch.job.BatchProcess.run(BatchProcess.java:99)
    at com.cv.ibs.batch.job.launcher.DataRetentionLauncher.main(DataRetentionLauncher.java:36)
Caused by: 
com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -3015, SQLSTATE:      , SQLERRMC: -551
    at com.ibm.db2.jcc.c.fg.d(fg.java:1340)
    at com.ibm.db2.jcc.b.gb.k(gb.java:351)
    at com.ibm.db2.jcc.b.gb.e(gb.java:96)
    at com.ibm.db2.jcc.b.w.e(w.java:83)
    at com.ibm.db2.jcc.b.vb.i(vb.java:164)
    at com.ibm.db2.jcc.c.fg.q(fg.java:1311)
    at com.ibm.db2.jcc.c.gg.d(gg.java:2386)
    at com.ibm.db2.jcc.c.hg.X(hg.java:115)
    at com.ibm.db2.jcc.c.hg.execute(hg.java:98)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:169)
    at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:1005)
    at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:1)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:953)
    ... 28 more
[main] ERROR c.cv.ibs.batch.job.DataRetentionJob - [BATCH] Error on executing the batch job
com.cv.ibs.cib.bulkpayment.BatchProcessException: Error in spring batch process, please checklog file and BatchFailedDetails table.
    at com.cv.ibs.batch.job.DataRetentionJob.execute(DataRetentionJob.java:60) ~[com.cv.ibs.batch.jar:na]
    at com.cv.ibs.batch.job.BatchProcess.run(BatchProcess.java:99) [com.cv.ibs.batch.jar:na]
    at com.cv.ibs.batch.job.launcher.DataRetentionLauncher.main(DataRetentionLauncher.java:36) [com.cv.ibs.batch.jar:na]

我怀疑此异常是由我未授予 db 用户的某些访问权限引起的。因此,我尝试从 SIT 环境中的 db 用户中获取一些访问权限(例如加载数据库等),尝试遇到相同的异常。但是,在 SIT 中,我遇到了其他错误,这清楚地告诉我根本原因是什么,而不是错误代码 -3015

试图从 Google 获得一些提示但失败了。我想我错过了一些寻找根本原因的要点/步骤。请多多指教。

【问题讨论】:

  • 您的程序对 SQL 注入开放;当然,这样的事情需要动态 SQL,但您应该验证表名和列是否都是实际的列名和表名(可能来自存储过程中)。最好将日期参数作为实际日期类型传递(最好是新的java.time 库中的某些内容)。您可能想要显式设置并发级别。此外,如果可能,不要在 SQL 中将比较列强制转换为日期,因为这可能会导致系统忽略索引。

标签: java stored-procedures db2 db2-luw sqlcode


【解决方案1】:

您可以使用 DB2 命令行获取有关错误的详细信息,只需使用异常中的 SQL 代码,删除减号并用零填充(在开头,如果它比 4 短):

db2 ? sql3015

SQL3015N 处理期间发生 SQL 错误“”。

解释:

实用程序调用期间发生 SQL 错误。

实用程序停止处理。

用户反应:

查看消息中的 SQLCODE(消息号)了解更多信息 信息。进行更改并重新提交命令。

我假设SQLERRMC: -551 是您的存储过程中发生的错误,即:

db2 ? sql0551

SQL0551N 语句失败,因为授权标识没有 有必要的授权或特权来执行 手术。授权 ID:“”。手术: “”。对象:“”。

更多关于那个错误here

遗憾的是,最初的消息并没有提供太多关于授权 ID 和操作等的信息。

在您的代码中自己捕获SqlException,看看getNextException() (javadoc) 是否会为您提供更多信息。

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 2017-04-02
    • 2013-11-23
    • 1970-01-01
    • 2020-03-20
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多