삭제용 오라클 함수

 create or replace PROCEDURE sp_DEL_member
(
        --매개변수 정의!
        id IN member.username%TYPE,        
        rtval OUT NUMBER                 => int 아님!
)
IS
BEGIN
        DELETE member WHERE USERNAME = ID;       
        IF sql%found THEN
               DBMS_OUTPUT.PUT_LINE(ID||'가 삭제되었습니다.');    
               rtval := SQL%ROWCOUNT;
            COMMIT;
        else  -- 존재하지 않은 id로 수정 시        
               DBMS_OUTPUT.PUT_LINE(ID||'ID가 존재하지 않아요');
              rtval := SQL%ROWCOUNT;
        END iF;

       EXCEPTION
   WHEN OTHERS THEN
     ROLLBACK;-- 실행이 1개밖에 없어 의미 없지만 그래도 써놔
     rtval := -1 ;
             DBMS_OUTPUT.PUT_LINE('자식이 참조 중...');                       
END;

 

 

앞에꺼랑 다른 점은

앞의 함수는 아웃파라미터의 반환 결과가 우리가 알 수 있는 바로 문자열로 나왔다면

이 함수는 반환결과가 숫나로 나와서 나온결과를 봐선 직관적으로 삭제가 된건지 실패가 된건지 알 수가 없음

반환결과인 숫자를 우리가 알 수 있는 문자로 출력해야하기 때문에

switch 구문을 이용한다 ! 

public class DeleteProc extends IConnectImpl {

	public DeleteProc() {
		connect(ORACLE_URL,"KOSMO","KOSMO");		
	   }
    @Override
	public void execute() throws Exception {
    	csmt = conn.prepareCall("{call sp_DEL_member (?,?)}");
        //인파라
		String user = getValue("삭제 할 아이디");  // 이렇게 나눠도 됨 아니면 csmt.setString(1,getValue("삭제 할 아이디"));
		csmt.setString(1,user);
        csmt.registerOutParameter(2,Types.NUMERIC); /// 이거 int도 아니고 integer도 아님!!!
    	csmt.execute();
     //System.out.println("실행 결과(아웃파라):"+csmt.getString(2)); 이렇게 해버리면 그냥 0,1,-1 출력 됨. 뭔지 알 수 없음
		int rtNum =csmt.getInt(2);
		switch(rtNum) {  // 변환값을 알아볼 수 있는 문자로 변환 해준다
			case -1 : System.out.println("삭제불가 : 자식참고중"); break;
			case 0 : System.out.println("아이디 존재하지 않음"); break;
			default : System.out.println(user+"가 삭제되었습니다.");
		}
		close();
    }   


public static void main(String[] args) throws Exception {
		 new DeleteProc().execute();

	}
}

+ Recent posts