아래 코드는 정상동작하지만
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | CREATE OR REPLACE PROCEDURE PR_ORD_DLV_RECOVERY ( P_ORD_NO IN NUMBER, P_PRD_SEQ IN NUMBER, P_BUNDLE_PASS_YN IN VARCHAR2, P_UPDR_ID IN VARCHAR2, P_TEST_YN IN VARCHAR2, R_RESULT_CD OUT VARCHAR2, R_RESULT_TYPE OUT VARCHAR2, R_RESULT_AMT OUT VARCHAR2, R_RESULT_MSG OUT VARCHAR2 ) IS BEGIN DBMS_OUTPUT.PUT_LINE( '대상 주문번호 : ' || P_ORD_NO); DBMS_OUTPUT.PUT_LINE( '대상 주문상품번호 : ' || P_PRD_SEQ); -- 결과 변수 설정 R_RESULT_CD := 'SUCCESS' ; R_RESULT_TYPE := 'INFO' ; R_RESULT_AMT := '100' ; R_RESULT_MSG := 'Recovery Completed' ; END PR_ORD_DLV_RECOVERY; |
아래의 코드는 오류가 나타납니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | CREATE OR REPLACE PROCEDURE PR_ORD_DLV_RECOVERY ( P_ORD_NO IN NUMBER, P_PRD_SEQ IN NUMBER, P_BUNDLE_PASS_YN IN VARCHAR2, P_UPDR_ID IN VARCHAR2, P_TEST_YN IN VARCHAR2, R_RESULT_CD OUT VARCHAR2, R_RESULT_TYPE OUT VARCHAR2, R_RESULT_AMT OUT VARCHAR2, R_RESULT_MSG OUT VARCHAR2 ) IS V_BUNDL_YN VARCHAR2(4); V_STTL_APRV_NO VARCHAR2(255); BEGIN DBMS_OUTPUT.PUT_LINE( '대상 주문번호 : ' || P_ORD_NO); DBMS_OUTPUT.PUT_LINE( '대상 주문상품번호 : ' || P_PRD_SEQ); -- 결과 변수 설정 R_RESULT_CD := 'SUCCESS' ; R_RESULT_TYPE := 'INFO' ; R_RESULT_AMT := '100' ; R_RESULT_MSG := 'Recovery Completed' ; END PR_ORD_DLV_RECOVERY; |
오류 내용:
Caused by: org.testcontainers.ext.ScriptUtils$ScriptStatementFailedException: Script execution failed (data.sql:2): V_STTL_APRV_NO VARCHAR2(255
Caused by: Error : 900, Position : 0, Sql = V_STTL_APRV_NO VARCHAR2(255), OriginalSql = V_STTL_APRV_NO VARCHAR2(255), Error Msg = ORA-00900: SQL 문이 부적합합니다
해당 프로시저를 작성하여 테스트컨테이너를 띄웠는데 변수를 선언하냐 안했냐에 따라 저렇게 오류가 나더라구요.. 잘 아시는 분 없을까요 ㅜㅜ
오류로 보아 스프링부트 같은 프레임워크에서 해당 구문을 호출하는것 같은데요,
아래와 같이 호출할 때 구분자를 오라클에 맞게 주었는지 확인해보세요.
ScriptUtils.executeSqlScript(Objects.requireNonNull(testSetupDataSource).getConnection(), new EncodedResource(resource), false, false, ScriptUtils.DEFAULT_COMMENT_PREFIX, ScriptUtils.EOF_STATEMENT_SEPARATOR, ScriptUtils.DEFAULT_BLOCK_COMMENT_START_DELIMITER, ScriptUtils.DEFAULT_BLOCK_COMMENT_END_DELIMITER);
그리고 스프링에 다음과 같은 설정이 있는지도 --> spring.datasource.separator=^^^ END OF SCRIPT ^^^
이것도 안된다면 마지막으로 의심해 볼 수 있는것은 (확률이 매우 적지만...) 변수 앞의 공백이 아스키코드 32가 아닌 유니코드공백문자일 가능성이 있습니다