2016-06-21 110 views
0

を呼び出すときに、私は次のようにストアドプロシージャがあります。SQLCODE:-3015ストアドプロシージャ

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からヒントを得ようとしましたが失敗しました。私は根本的な原因を見つけるためにいくつかのポイント/ステップを逃していると思います。親切なアドバイス。

+0

プロシージャはSQLインジェクションに対してオープンです。このようなものには動的SQLが必要ですが、テーブル名とカラムが実際のカラム名とテーブル名の両方であることを検証する必要があります(おそらくストアドプロシージャ内から)。 dateパラメータを実際の日付型(新しい 'java.time'ライブラリのなかから取り出したいもの)として渡すことをお勧めします。おそらく、並行性レベルを明示的に設定したいと思うでしょう。また、可能であれば、SQLで比較列を日付にキャストしないでください。これは、システムによってインデックスが無視される可能性があるためです。 –

答えて

0

エラーの詳細情報を取得するためにDB2コマンドラインを使用できます。例外からSQLコードを使用し、マイナス記号を削除してゼロ(ゼロよりも小さい場合は冒頭に4) :

db2 ? sql3015 

SQL3015Nは、SQLエラー "<SQLCODE>は" 処理中に発生しました。

説明:

ユーティリティコール中にSQLエラーが発生しました。

ユーティリティが処理を停止します。

ユーザー応答:より 情報のメッセージにSQLCODE(メッセージ番号)で

ルック。変更を加えてコマンドを再実行してください。

私はSQLERRMC: -551を前提とはしている、あなたのストアドプロシージャに起こったエラーです:許可IDがに必要な権限または特権を持ってい ないため、ステートメントが失敗した

db2 ? sql0551 

SQL0551N オペレーションを実行します。承認ID: "<承認ID:>"操作: "<操作>"。オブジェクト: "<オブジェクト名>"

さらに詳しいエラーhere

悲しいことに、最初のメッセージでは、認証IDと操作などに関する多くの情報を提供していません。

javadoc)があなたに詳しい情報を与える場合は、自分のコードでSqlExceptionをキャッチして見てください。

関連する問題