一、問題
最近在自己搭建spring batch的框架,一步一步趟坑中;
java.sql.SQLSyntaxErrorException: ORA-02289
二、解決
通過Debug發現,就是在這一句代碼執行時報錯的:
JobExecution execution = this.jobLauncher.run(job, nextParameters);
但是,我們找到這個run()方法,發現也沒有特別的地方:只有一個接口:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.batch.core.launch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
public interface JobLauncher {
JobExecution run(Job var1, JobParameters var2) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException;
}
但是它一直在報,沒有序列號這個錯誤,很鬱悶,明明還沒有到執行sql那一步啊?後來恍然大悟,spring batch搭建框架時,有6張基礎的配置表,這6張基礎的配置是必須的,如果沒有,就會報錯;Oracle環境下6張配置表的基本建表語句如下:
--1、批量實例表
CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID NUMBER(19,0) NOT NULL PRIMARY KEY ,
VERSION NUMBER(19,0) ,
JOB_NAME VARCHAR2(100) NOT NULL,
JOB_KEY VARCHAR2(32) NOT NULL,
constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ;
--2、批量執行表
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY ,
VERSION NUMBER(19,0) ,
JOB_INSTANCE_ID NUMBER(19,0) NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL,
START_TIME TIMESTAMP DEFAULT NULL ,
END_TIME TIMESTAMP DEFAULT NULL ,
STATUS VARCHAR2(10) ,
EXIT_CODE VARCHAR2(2500) ,
EXIT_MESSAGE VARCHAR2(2500) ,
LAST_UPDATED TIMESTAMP,
JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
--3、批量執行參數表
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS (
JOB_EXECUTION_ID NUMBER(19,0) NOT NULL ,
TYPE_CD VARCHAR2(6) NOT NULL ,
KEY_NAME VARCHAR2(100) NOT NULL ,
STRING_VAL VARCHAR2(250) ,
DATE_VAL TIMESTAMP DEFAULT NULL ,
LONG_VAL NUMBER(19,0) ,
DOUBLE_VAL NUMBER ,
IDENTIFYING CHAR(1) NOT NULL ,
constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
--4、批量步驟執行表
CREATE TABLE BATCH_STEP_EXECUTION (
STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY ,
VERSION NUMBER(19,0) NOT NULL,
STEP_NAME VARCHAR2(100) NOT NULL,
JOB_EXECUTION_ID NUMBER(19,0) NOT NULL,
START_TIME TIMESTAMP NOT NULL ,
END_TIME TIMESTAMP DEFAULT NULL ,
STATUS VARCHAR2(10) ,
COMMIT_COUNT NUMBER(19,0) ,
READ_COUNT NUMBER(19,0) ,
FILTER_COUNT NUMBER(19,0) ,
WRITE_COUNT NUMBER(19,0) ,
READ_SKIP_COUNT NUMBER(19,0) ,
WRITE_SKIP_COUNT NUMBER(19,0) ,
PROCESS_SKIP_COUNT NUMBER(19,0) ,
ROLLBACK_COUNT NUMBER(19,0) ,
EXIT_CODE VARCHAR2(2500) ,
EXIT_MESSAGE VARCHAR2(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
--5、批量步驟執行內容表
CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT (
STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR2(2500) NOT NULL,
SERIALIZED_CONTEXT CLOB ,
constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) ;
--6、批量任務執行上下文;
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT (
JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR2(2500) NOT NULL,
SERIALIZED_CONTEXT CLOB ,
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
--1、批量任務序列號
create sequence BATCH_JOB_SEQ
minvalue 0
maxvalue 9999999999999999999
start with 0
increment by 1
cache 20;
--2、批量任務執行序列號
create sequence BATCH_JOB_EXECUTION_SEQ
minvalue 0
maxvalue 9999999999999999999
start with 0
increment by 1
cache 20;
--3、批量步驟執行序列號
create sequence BATCH_STEP_EXECUTION_SEQ
minvalue 0
maxvalue 9999999999999999999
start with 0
increment by 1
cache 20;
--查詢語句
select a.*,rowId from BATCH_JOB_INSTANCE a;
select a.*,rowId from BATCH_JOB_EXECUTION a;
select a.*,rowId from BATCH_JOB_EXECUTION_PARAMS a;
select a.*,rowId from BATCH_STEP_EXECUTION a;
select a.*,rowId from BATCH_STEP_EXECUTION_CONTEXT a;
select a.*,rowId from BATCH_JOB_EXECUTION_CONTEXT a;
其他具體內容,請見【spring batch(二)】;
刪除表的語句如下:
drop table BATCH_JOB_INSTANCE cascade constraints;
drop table BATCH_JOB_EXECUTION cascade constraints;
drop table BATCH_JOB_EXECUTION_PARAMS;
drop table BATCH_STEP_EXECUTION cascade constraints;
drop table BATCH_STEP_EXECUTION_CONTEXT;
drop table BATCH_JOB_EXECUTION_CONTEXT;
注意;
這裏使用了cascade constraints
,級聯刪除了約束關係;因爲這裏存在父子數據關聯;我們先刪除這種關聯關係,然後再刪除表(但是子數據不會被刪除);