동적 쿼리 질문.. 0 3 1,884

by 허정 [2012.04.16 15:55:22]


CREATE OR REPLACE PROCEDURE SCOTT.AddFriend
(My_ID in varchar2,Fr_ID in varchar2,retVal out number)
IS
    str varchar2(300);
    res number;
Begin
    str:='select count(*) into res from '||My_ID||'_friend where F_ID=Fr_ID';
    EXECUTE IMMEDIATE str; 
    IF res>0
    THEN
        retVal:=0;
    ELSE
        str:='insert into '||My_ID||'_friend ('||Fr_ID||',FRIENDNUMSEQ.NEXTVAL)';
        EXECUTE IMMEDIATE str;
        retVal:=1;
    END IF;
    
    Exception
    When no_data_found Then
    null;
END AddFriend;
/

 이부분에서 식별자 오류가 뜹니다.ㅜㅜ
 
 str:='select count(*) into res from '||My_ID||'_friend where F_ID=Fr_ID';

 동적으로 테이블을 생성해서   '||My_ID||'_friend 이 테이블은 분명 찾아 냅니다.ㅜㅜ

 물론 F_ID 컬럼두 있구요.

 F_ID컬럼에서 입력받은 Fr_ID와 동일한 컬럼이 존재한다면 그 count를 반환하는 쿼리를 만들었습니다.

 근데 Fr_ID : 부적합한 식별자 오류가 뜨더군요 ㅠㅜㅜ

 그래서 str:='select count(*) into res from '||My_ID||'_friend where F_ID='||Fr_ID; 

 이렇게 바꿨는데 Fr_ID에 Heojung 을 입력받앗다면 Heojung: 부적합한 식별자 오류가 뜹니다 ㅜㅜ

 어떻게 쿼리를 작성해야될지 모르겠습니다ㅜㅜ



by 마농 [2012.04.16 16:35:30]
CREATE OR REPLACE PROCEDURE scott.AddFriend
( My_ID IN VARCHAR2
, Fr_ID IN VARCHAR2
, retVal OUT NUMBER
)
IS
  str VARCHAR2(300);
  res NUMBER;
BEGIN
  str := 'SELECT COUNT(*) FROM '||My_ID||'_friend WHERE f_id = :Fr_ID';
  EXECUTE IMMEDIATE str INTO res USING Fr_ID;
  IF res > 0 THEN
    retVal := 0;
  ELSE
    str := 'INSERT INTO '||My_ID||'_friend VALUES(:Fr_ID, friendnumseq.NEXTVAL)';
    EXECUTE IMMEDIATE str USING Fr_ID;
    retVal := 1;
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL;
  WHEN OTHERS THEN
    NULL
END AddFriend;
/

by 허정 [2012.04.16 16:53:37]
아~~ 입력받은 파라미터를 사용할때 쿼리작성할때 : 을 넣어야 되는거였군요..

감사합니다^^

 USING은 뭔지 모르겠네요 ㅎㅎ 공부해봐야겠습니다 감사합니다

by 마농 [2012.04.16 17:06:36]

:은 바인드변수를 사용한다는 의미일뿐
:fr_id 가 fr_id의 값이 직접 치환된다는 의미가 아닙니다.
:으로 정의된 바인드변수 위치에 값을 지정해주는 역할은 USING 이 하는 것입니다.

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