프로시저 INSERT문에서 시퀀스값을 따로 담아둘수 있나요? 0 8 8,396

by Albothyl [PL/SQL] [2012.03.31 21:15:41]



글을 등록할 때 보통 글번호값을 시쿼스로 잡아주는데, 이 시퀀스값을 담아두었다가 같은 프로시저내에서 다음
쿼리문으로 넘겨줄수있는 방법이 없을까요?
WHERE절에 서브쿼리
SELECT board_seq.currval
FROM   TBL_BOARD 를 해줘도 안되고,

또 프로시저에 임시변수  
tempbbsno := board_seq.nextval; 을 해주고 이 변수값을 인설트문에 넣어줄려고해도 안되네요.

인설트문에서 사용한 시퀀스값을 같은 프로시저안에서 다음 쿼리문에 사용할 수 있는 방법을 알려주세요!!

============================================================================================

CREATE OR REPLACE PROCEDURE createboard(I_subjects IN VARCHAR2
   ,I_title    IN VARCHAR2
   ,I_content  IN VARCHAR2
   ,I_writer   IN VARCHAR2)
IS
 fastcall tbl_board.FASTCALL_B%TYPE;

BEGIN
 INSERT INTO tbl_board(BBSNO, SUBJECTS, TITLE, CONTENT, WRITER, GID, PID)
 VALUES(board_seq.nextval, I_subjects, I_title, I_content, I_writer, board_seq.currval, 0);

 SELECT FASTCALL_B
    INTO fastcall
    FROM TBL_BOARD
    WHERE BBSNO =이 부분에 현재 시퀀스값이 들어가야함;


 UPDATE TBL_BOARD
 SET    FASTCALL_B = NVL(fastcall_b, fastcall)
 WHERE  BBSNO =이 부분에 현재 시퀀스값이 들어가야함;

END;
============================================================================================

by 강서꽃미남 [2012.04.02 09:55:56]
문제가 위에 1이 찍혔으면 밑에부분도 같은 시퀀스가들어가야 한다는 말인가요..?

시퀀스 자동증가하니까 밑에서는

select (시퀀스명).currval from dual;
로 지금 시퀀스 넘버 찍어주면 되지 않나요..?


by 마농 [2012.04.02 09:56:06]

board_seq.currval 을 사용하시면 됩니다만...

by Albothyl [2012.04.02 22:56:25]

- select (시퀀스명).currval from dual;
- board_seq.currval 
모두 해봤는데 계속 에러가 발생합니다. 밑에 쿼리2개에서 시퀀스 관련부분 지워주면 에러발생 않하구요.

by Albothyl [2012.04.02 23:03:49]
 tbl_board_seq.currval 로 해주면 PL/SQL: ORA-02287: sequence number not allowed here 라는 에러가 발생하고, 셀렉트문을 이용해서 적어주면  PL/SQL: ORA-00936: missing expression 이건 정확히 해주었는데도 이런 에러가 발생하네요.

by Albothyl [2012.04.02 23:05:17]
 이상한게 인설트문에서는 board_seq.nextval, board_seq.currval 모두 에러없이 잘 동작하지만, 밑에 select문과 update문에서 저 시쿼스를 사용할 때 저렇게 에러가 나니..원인을 모르겠습니다.

by 손님 [2012.04.02 23:38:36]
CREATE OR REPLACE PROCEDURE createboard(I_subjects IN VARCHAR2
  ,I_title  IN VARCHAR2
  ,I_content IN VARCHAR2
  ,I_writer  IN VARCHAR2)
IS
 fastcall tbl_board.FASTCALL_B%TYPE;
 v_currseq number;
BEGIN
 INSERT INTO tbl_board(BBSNO, SUBJECTS, TITLE, CONTENT, WRITER, GID, PID)
 VALUES(board_seq.nextval, I_subjects, I_title, I_content, I_writer, board_seq.currval, 0);

 SELECT board_seq.currval INTO v_currseq
  FROM DUAL;
  
 SELECT FASTCALL_B
  INTO fastcall
  FROM TBL_BOARD
  WHERE BBSNO = v_currseq;

 UPDATE TBL_BOARD
 SET  FASTCALL_B = NVL(fastcall_b, fastcall)
 WHERE BBSNO = v_currseq;
END;

by Albothyl [2012.04.03 23:02:32]

 ㅠㅠ  위에 손님분 감사합니다. 정말 감사합니다.
제가 이 방법을 할 때 FROM을 TBL_BOARD로해서 ..시퀀스값이 안넘겨졌던것 같네요.
도움 정말 감사합니다.
SELECT board_seq.currval INTO v_currseq
FROM DUAL;


by 손님 [2012.04.24 14:07:06]


SELECT
board_seq.currval INTO v_currseq
  FROM DUAL;

프로그램상에 위 코드넣으면 않될껍니다.

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