database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38980 게시물 읽기
No. 38980
trigger 질문 드립니다..꼭 부탁해요...^^;; 아 머리야...
작성자
박정호(iloveparkjh)
작성일
2011-10-18 14:57
조회수
4,222

두게의 테이블이 있습니다...

CREATE TABLE MWA0303D (                  --------------------- A
  CMPT_APPR_NO     VARCHAR2(20 BYTE),
  APPR_ORD         NUMBER,
  APPR_MN_ID       VARCHAR2(6 BYTE),
  APPR_STAT        VARCHAR2(1 BYTE)
)

CREATE TABLE M_ALRAM(                    ------------------------ B
  SENDUSER    VARCHAR2(15 BYTE),
  TARGETUSER  VARCHAR2(20 BYTE)
)

A테이블에 트리거를 걸어 B 테블에 insert 하는 로직 입니다...

문제는 A 테이블이 결재 순서를 가지고 있습니다...

A테이블의 1번 결재자가 결재를 했으면 A 테이블의 2번째 결재자 ID를 찾아야 합니다..

CREATE OR REPLACE TRIGGER tU_MWA0303D_01
       AFTER INSERT OR UPDATE OF APPR_STAT ON  MWA0303D
       FOR EACH ROW
DECLARE
         var_SENDUSER     VARCHAR2(100);
BEGIN
      SELECT APPR_MN_ID INTO  var_SENDUSER
   FROM MWA0303D
   WHERE CMPT_APPR_NO = :NEW.CMPT_APPR_NO
   AND APPR_ORD = (:NEW.APPR_ORD+1);
END;

여기서 ORA-04091 에러가 발생합니다....

움직이고 있는  자기 자신 테이블을 조회할수 없다는 건데요....

어떻게 해야 두번째 결재자를 찾아 올수 있을까요?

고수분들의 조언 부탁합니다.....^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

미리 감사 드립니다....   꾸벅...(--)   (_)

이 글에 대한 댓글이 총 1건 있습니다.

다음과 같이, Global 변수, Row 트리거, 그리고 Statement 트리거로 해결 할수 있읍니다.

 

CREATE OR REPLACE PACKAGE pkg_for_global_variable
AS
  CMPT_APPR_NO VARCHAR2(20 BYTE);
  APPR_ORD     NUMBER;
END;
/

 

CREATE OR REPLACE TRIGGER trg_MWA0303D_aiur
  AFTER INSERT OR UPDATE OF APPR_STAT ON  MWA0303D
  FOR EACH ROW

BEGIN
 
  pkg_for_global_variable.CMPT_APPR_NO := :new.CMPT_APPR_NO;
  pkg_for_global_variable.APPR_ORD     := :new.APPR_ORD;
 
END ;
/

 

CREATE OR REPLACE TRIGGER trg_MWA0303D_aiu
  AFTER INSERT OR UPDATE OF APPR_STAT ON MWA0303D

DECLARE
    
  var_SENDUSER     VARCHAR2(100);
   
BEGIN

   SELECT APPR_MN_ID INTO var_SENDUSER
     FROM MWA0303D
     WHERE CMPT_APPR_NO = pkg_for_global_variable.CMPT_APPR_NO
       AND APPR_ORD     = pkg_for_global_variable.APPR_ORD + 1;
      
   INSERT INTO M_ALRAM VALUES (var_SENDUSER, 'TEST');
 
END ;
/

hopper(bunny)님이 2011-10-19 16:07에 작성한 댓글입니다.
이 댓글은 2011-10-19 16:08에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
38984v$session과 v$sqlarea의 join key 관련 문의 [1]
초보
2011-10-19
4550
38983함수사용법 조언 바랍니다.. (lpad, rpad) [2]
qa
2011-10-19
4239
38982특정문자로 나누는 방법을 알고 싶읍니다. [2]
용가리
2011-10-18
4712
38980trigger 질문 드립니다..꼭 부탁해요...^^;; 아 머리야... [1]
박정호
2011-10-18
4222
38978GREATEST에서 최대값 갯수 및 위치 알아내기 [3]
이장
2011-10-17
4146
38977전후 데이터의 시간차이 계산시 [2]
달타냥
2011-10-17
5585
38975이력조회쿼리문을 만들려고합니다. [2]
오라초
2011-10-17
4369
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다