2016-12-28 5 views
0

groovy를 사용하여 oracle db 테이블에 파일을 삽입하려고합니다.Groovy에서 Clob 열로 Oracle DB 테이블을 삽입하는 중 예외가 발생했습니다

import groovy.io.FileType 
import groovy.sql.Sql 
import oracle.jdbc.OracleDriver 

import java.sql.Date 

final def PROJECT_DIR = "/appdata/project/pmp" 
final def SCRIPT_DIR = "/scm/src/main/scripts" 

// To be able to use driver... 
new OracleDriver(); 

sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "PMP", "pmp") 

sql.execute("delete from SCM_GROOVY_SCRIPTS") 

def dir = new File(PROJECT_DIR + SCRIPT_DIR); 
dir.eachFileRecurse(FileType.FILES) { file -> 
    String scriptName = file.name.substring(0, file.name.indexOf('.')) 
    def timestamp = new Date(System.currentTimeMillis()) 

    println scriptName 
    println timestamp 

    List<Object> params = new ArrayList<>() 
    params.add(scriptName) 
    params.add(file.bytes) 
    params.add(timestamp) 

    sql.execute("INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) VALUES (?, ?, ?)", params) 
} 

sql.close() 

내가 코드를 실행할 때 나는 다음과 같은 출력을 얻을 : 나는 다음과 같은 코드를 사용하고 있습니다.

ServiceUpdateRule

2016년 12월 28일

2016년 12월 28일 실행 groovy.sql.Sql 오전 11시 1분 56초 경고 : 실행하지 못했습니다 : INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME을, SCRIPT_SOURCE, LAST_UPDATED) VALUES (,) 때문에?? ORA-01461 : 긴 컬럼으로 만 삽입하는 LONG 값을 결합 할 수

잡힌 :은 java.sql.SQLException : ORA-01461은 : 결합 수 LONG 값만,긴 열

java.sql.SQLException의 내로 삽입 용 : I가 CLOB 인수로 전달하면 긴 열

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:972) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3415) 
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3521) 
    at InsertUpdate$_run_closure1.doCall(InsertUpdate.groovy:35) 
    at InsertUpdate.run(InsertUpdate.groovy:23) 

에 유일한 삽입하는 LONG 값을 결합 할 수 ORA-01461 file.bytes 대신 null을 사용하면 오류없이 모든 행을 삽입합니다. 내 테이블의 구조는 다음과 같다 : 나는 CLOB 대신 BLOB 데이터 형식을 사용하는 경우 또한

CREATE TABLE SCM_GROOVY_SCRIPTS (
     SCRIPT_NAME VARCHAR2(255) NOT NULL, 
     SCRIPT_SOURCE CLOB, 
     LAST_UPDATED DATE DEFAULT SYSDATE , 
     PRIMARY KEY (SCRIPT_NAME) 
); 

, 코드가 작동합니다.

+1

'Clob'은 문자 데이터 유형이며 일반 바이트가 아닙니다. –

답변

0

마지막으로, CLOB 데이터 유형을 삽입하는 방법을 찾았습니다.

해결책은 java.sql.Clob 및 oracle.sql.CLOB 클래스를 사용하는 것입니다.

import groovy.io.FileType 
import groovy.sql.Sql 
import oracle.jdbc.OracleDriver 
import oracle.sql.CLOB 

import java.sql.Clob 
import java.sql.Date 

final def PROJECT_DIR = "/appdata/project/pmp" 
final def SCRIPT_DIR = "/scm/src/main/scripts" 

// To be able to use driver... 
new OracleDriver(); 

Sql sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "PMP", "pmp") 

sql.execute("delete from SCM_GROOVY_SCRIPTS") 

def dir = new File(PROJECT_DIR + SCRIPT_DIR); 
dir.eachFileRecurse(FileType.FILES) { file -> 
    String scriptName = file.name.substring(0, file.name.indexOf('.')) 
    def timestamp = new Date(System.currentTimeMillis()) 

    println scriptName 
    println timestamp 

    Clob clob = CLOB.createTemporary(sql.getConnection(), false, CLOB.DURATION_SESSION); 
    clob.setString(1, file.getText("UTF-8")) 

    List<Object> params = new ArrayList<>() 
    params.add(scriptName) 
    params.add(clob) 
    params.add(timestamp) 

    sql.execute("INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) VALUES (?, ?, ?)", params) 
} 

sql.close()