2017-11-01 16 views
0

표준 ORACLE SQL 예제 테이블 EMP의 경우 스키마에 EMPNO가 기본 키이고 MGR이 현재 직원의 직접 관리자에 대한 EMPNO입니다 (외래 키는 테이블 자체를 참조 함).하나의 단일 테이블에서 종속 행을 재귀 적으로 삭제합니다.

질문 1 : 한 관리자를 삭제하고이 관리자로 작업하는 모든 사람을 직접 삭제하는 재귀 SQL 프로 시저를 작성하는 방법 , 직접보고하지 않은 사용자 포함?

질문 2 : 반복되는 기본 테이블에 의해 생성 된보기에서 삭제를 수행 할 수 있습니까?

+0

IMO는 질문 1을 해결하는 "올바른"방법은 하위 삭제를 처리하는 ON DELETE 트리거를 정의하는 것입니다. YMMV. –

+0

당신은'MGR'에 외래 키를 가지고 있습니다. 따라서 관리자 아래에있는 모든 직원을 반복적으로 삭제하려고한다면 그 직원 중 하나가 관리자 일 경우 어떻게해야합니까? 자식 레코드가 발견되어 제약 조건 오류가 발생해도 실패하지 않습니까? –

답변

0

단일 삭제 명령문을 사용하여 수행 할 수 있습니다.

HIERARCHICAL 쿼리를 사용하여 계층 구조의 모든 직원을 SELECT 한 다음 삭제해야합니다.

예에 기반 VIEW를 사용하여 표준 오라클 SQL 예를 들어 테이블 EMP

DELETE FROM EMP WHERE EMPNO IN 
(SELECT EMPNO 
FROM EMP 
CONNECT BY PRIOR EMPNO = MGR 
START WITH EMPNO=7566); 

모든 최고의 :

0

네,이 수에 EMPNO 7566 (JONES)에서 모든 직원을 제거하려면 테이블에는 대신 INSTEAD OF DELETE가 표시됩니다. 트리거가 표시됩니다.

는 직원 테이블을 기반으로 뷰를 생성합니다

CREATE VIEW EMPLOYEE_VIEW AS SELECT * FROM EMPLOYEES; 

보기

CREATE OR REPLACE TRIGGER EMPLOYEE_VIEW_DEL INSTEAD OF DELETE ON 
EMPLOYEE_VIEW 
FOR EACH ROW 
BEGIN 
    DELETE FROM EMPLOYEES WHERE MANAGER_ID =:OLD.EMPLOYEE_ID; 

END; 
/

이 작동합니다에 트리거를 다음 생성이 테이블 오류를 변경했을 돌연변이 테이블 오류 ORA-04091을 피할 것!

평화!