PL/SQL 사용 질문드립니다. 0 6 1,225

by SQL모험가 [2021.07.29 10:39:38]


오라클 버전은 9i이고 해당 함수를 만들려고 합니다.

다만 이걸 하니까

CREATE OR REPLACE FUNCTION test_func(code IN NUMBER)
    RETURN VARCHAR2
IS
   v_test VARCHAR2(100);
   v_temp_num   NUMBER := 0;
   v_result     INTEGER;
   vTempBascOrig    VARCHAR2(7);
   vTempBascOrigRev VARCHAR2(7);
   pos VARCHAR2(7);
BEGIN
  v_test := 'testFunction';
  vTempBascOrig := TO_CHAR(code);
  select reverse(vTempBascOrig) into vTempBascOrigRev from dual;
  FOR i in 1..4 LOOP
  END LOOP;
EXCEPTION
    when others then
    dbms_output.put_line('exception occurred! (' || sqlcode || ') : ' || sqlerrm);
    return '';
RETURN vTempBascOrig;
END test_func;

 

LINE/COL  ERROR
--------- -------------------------------------------------------------
15/3      PLS-00103: 심볼 "END"를 만났습니다 다음 중 하나가 기대될 때: ( begin    case declare exit for goto if loop mod null pragma raise    return select update while with <식별자>    <큰 따옴표로 구분된 식별자> <바인드 변수> << continue close    current delete fetch lock insert open rollback savepoint set    sql execute commit forall merge pipe purge 
오류: 컴파일러 로그를 확인하십시오.

 

이렇게 뜹니다;

세미 콜론도 제대로 썼다고 생각하는데 Loop문 이전에 뭐 써야 하는게 있나요?

by 축구쟁이 [2021.07.29 10:59:12]

변수 선언부에 DECLARE가 누락되었습니다.


by SQL모험가 [2021.07.29 12:13:43]

답변 감사합니다 다만 의아한게; 지금 DECLARE가 없어도 돌아가긴 합니다 이상하게.. Loop안쪽에 빈 공백인게 문제였습니다.


by 축구쟁이 [2021.07.29 12:36:28]

그게 맞는 것 같습니다.

저도 LOOP안에 입력한게 제일 처음 한 조치였는데 제 tool이 이상한건지 정상 처리되었다가 오류가 발생했다 하네요... 

DECLARE는 생략이 가능한가 본데 이것도 오류가 발생했다 안했다...  아무튼 혼동을 드려 죄송합니다 ㄷㄷ


by 마농 [2021.07.29 12:57:39]

PL/SQL 블럭의 구조는
DECLARE, BEGIN, EXCEPTION, END 로 이루어 지며
BEGIN, END 는 필수이고 DECLARE, EXCEPTION 은 생략 가능합니다.
CREATE 함수/프로시져 구문의 경우 IS 구문이 DECLARE 역할을 합니다.


by 마농 [2021.07.29 11:15:32]

1. LOOP 문안에 아무것도 없으면 안됩니다.
- 적을 거 없으면 null; 이라도 넣으세요.
- 필요 없다면 LOOP 문을 아예 빼세요.
2. return 구문이 2개네요?
- 둘 중 하나는 exception 구문 이전에 와야 할 듯.


by SQL모험가 [2021.07.29 12:14:05]

Loop안에 무엇이라도 있어야 되었네요; 답변 감사드립니다

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