프로시저 관련 질문.. 0 2 4,386

by 왕찬이 [PL/SQL] 프로시저 [2024.06.03 10:46:56]


아래 코드는 정상동작하지만

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 문이 부적합합니다

 

해당 프로시저를 작성하여 테스트컨테이너를 띄웠는데 변수를 선언하냐 안했냐에 따라 저렇게 오류가 나더라구요.. 잘 아시는 분 없을까요 ㅜㅜ

 

by 마농 [2024.06.03 13:18:31]

구문에는 문제 없어 보입니다.
- 다시 한번 더 처음 부터 차근차근 시도 해 보세요.
- 다른 문제는 없는지? 찾아보세요.


by 신히 [2024.06.05 08:16:53]

오류로 보아 스프링부트 같은 프레임워크에서 해당 구문을 호출하는것 같은데요,

아래와 같이 호출할 때 구분자를 오라클에 맞게 주었는지 확인해보세요.

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가 아닌 유니코드공백문자일 가능성이 있습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입