0

同じテーブルから選択された行のコピーであるテーブルに新しい行を挿入しようとしています。テーブルからIDに基づいて行を選択し、いくつかの新しい値で同じテーブルに挿入するプロシージャを作成しました。このプロシージャは、新しい行の PK も返します。

CallableStatement を実行すると、以下の例外が発生します。

java.sql.SQLException: ORA-06550: line 1, column 371:
PL/SQL: ORA-00933: SQL command not properly ended
ORA-06550: line 1, column 7:
PL/SQL: SQL Statement ignored

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)

エラーを見つけることができません

Commond が適切に終了していない

私の手順では

参考までにマイコード。ヘルプやヒントをいただければ幸いです。ありがとうございました。

public void updateFileToThisVersion(VaMediaFile fileDTO, Long fromMediaId){

    Connection conn = null;
    CallableStatement cst = null;
    try {
        String insertQuery = "BEGIN INSERT INTO VA_MEDIA_FILE (VMF_ID, VMF_FILE_NAME, VMF_FILE, VMF_FILE_CONTENT_TYPE, VMF_FILE_VER_NUM, VMF_IS_ACTIVE, VMF_UPLOADED_BY_ROLE_ID, VMF_UPLOADED_BY_USER_ID, VMF_UPLOADED_TS, VMF_COMMENTS) " + 
                "  (SELECT VMF_ID_SEQ_NUM.NEXTVAL, VMF_FILE_NAME, VMF_FILE, VMF_FILE_CONTENT_TYPE, ?, 'Y', ?, ?, SYSDATE, VMF_COMMENTS FROM VA_MEDIA_FILE where VMF_ID = ?) RETURNING VMF_ID INTO ?; END;";


        conn = getConnection(); 
        conn.setAutoCommit(false);
        cst = conn.prepareCall(insertQuery);

        cst.setString(1, fileDTO.getFileVerNum());
        cst.setString(2, fileDTO.getUploadedByRoleId());
        cst.setString(3, fileDTO.getUploadedByUserId());
        cst.setLong(4, fromMediaId);            
        cst.registerOutParameter(5, Types.NUMERIC);

        cst.execute();
        long newRecordId = cst.getLong(5);
        if(newRecordId != 0L){                      
            conn.commit();
        }           

    } catch (Exception sqlException) {
    } finally {
        OracleDaoUtils.closeQuietly(cst, conn);     
    }               
}
4

1 に答える 1

0

Oracleは、「挿入ステートメント内のselectステートメント」と「returning」句を混在させることを好まないようです。まず、selectステートメントのすべてのフィールドを含むレコードタイプを選択する別のselectステートメントが必要になります。次に、レコードからのvmf_idをJDBC出力パラメーターに割り当てることができます。最後に、挿入ステートメントでレコードを使用できます。

于 2013-02-13T23:41:59.970 に答える