아래 코드는 정상동작하지만
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;
아래의 코드는 오류가 나타납니다.
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가 아닌 유니코드공백문자일 가능성이 있습니다