2017-12-06 7 views
0

필드 초대가있는 테이블 PET에 대한 트리거를 만들고 테이블 PEOPLE의 Phone이라는 필드 값을 기준으로 Yes 또는 No으로 바꿉니다. 전화 번호가 null이 아니면 PET 테이블의 다른 필드 중 일부가 유효한 값을 가지며 null이 아닌 경우 Invitation 필드의 값이 Yes이됩니다.PLSQL ORACLE : 트리거가있는 오류

내가 할 수 있지만 나중에 내 테이블을 업데이트하고 필드 중 하나를 null로 설정하려고하면 문제가 발생합니다. 초대장 필드의 값을 No으로 업데이트하지 않습니다. 그래서 지금은 초대장 값을 변경할 수 있도록 필수 필드가 null이 아닌지 확인하는 PET 테이블 자체에 대한 트리거를 만드는 중입니다.

그러나 문제는 사용자가 PEOPLE 테이블로 이동하기 전에 PET 테이블에 데이터를 입력해야한다는 것입니다. 그래서 내 방아쇠 PET 내 데이터를 삽입 할 때 어떤 값을 가져올 수 없습니다. 여기

내가 방아쇠를 위해 한 것입니다 : 사람 또는 가족 테이블에 값이 아직 없습니다 :

create or replace trigger Phone_check 
    before insert or update on PETS 
    for each row 
DECLARE 
    SELECT phone INTO v_phone 
    FROM PEOPLE 
     INNER JOIN Family ON PEOPLE.ID=FAMILY.ID 
     INNER JOIN PETS ON FAMILY.ID=PETS.ID 
    WHERE PETS.ID=:NEW.ID; 
    IF :NEW.NAME IS NOT NULL 
    AND :NEW.AGE IS NOT NULL 
    AND v_phone IS NOT NULL THEN 
     :NEW.INVITATION:='Yes'; 
    ELSIF :NEW.NAME IS NULL 
    OR :NEW.AGE IS NULL 
    AND v_phone IS NULL THEN 
     :NEW.INVITATION:='No'; 
    END IF; 
END; 

나는이 트리거 문제가 무엇인지 얻는다. 그러나 PET 테이블이 첫 번째 테이블로 간주됩니다. 이 문제를 어떻게 해결해야합니까? 필요한 값이 이미 다른 테이블에 이미있는 경우에만이 트리거를 활성화하는 방법이 있습니까? 나는 정말로 혼란 스럽다.

+0

* "문제가. 사용자가 사람들의 테이블쪽으로 가기 전에 PET 테이블에 데이터를 입력하는 것입니다"* 그것은 바로 당신의 문제입니다. 애완 동물은 사람들에게 속하지만, 다른 방법은 아닙니다. [101 달마 시안] (https://en.wikipedia.org/wiki/One_Hundred_and_One_Dalmatians)을 모델로하지 않는 한. – APC

+0

@ APC 네가해야 할 임무는 지옥처럼 이상합니다. 그들은 다른 것보다 먼저 PET에 데이터를 입력하기를 원합니다. 그리고 실제로 모든 것이 제공 될 때 초대 상태를 '예'로 변경할 수 있지만 결국에는 PET 테이블의 필수 필드 중 하나에서 값을 변경하고 설정합니다. 그것 null로, 초대장은 여전히 ​​예로 설정되어 있습니다. 조건에 따라 트리거를 활성화하는 방법이 있습니까? – Kim

답변

0

"PET 테이블의 필수 필드 중 하나에서 값을 변경하고 null로 설정할 때 초대장은 여전히 ​​YES로 설정되어 있습니다."

No에 초대를 변경 드라이브 트리거의 조건

은 이것이다 :
ELSIF :NEW.NAME IS NULL 
OR :NEW.AGE IS NULL 
AND v_phone IS NULL THEN 

그래서 PEOPLE.PHONE 그 지점을 가지 않을 트리거를 null가 아닌 경우. 당신이 PET.NAME 또는 PET.AGE null로 설정하면

ELSIF :NEW.NAME IS NULL 
OR :NEW.AGE IS NULL 
OR v_phone IS NULL THEN 

트리거는 다음 역할을 : 당신이 원하는 것은 것 같다.


여기서 비즈니스 로직은 실제로 혼란 스럽습니다. 조건은 세 개의 테이블에있는 레코드의 존재를 기반으로합니다. 이는 트리거에 대한 유익한 사용 사례입니다. 더 나은 구현은 세 개의 테이블 모두에 레코드를 삽입하는 저장 프로 시저를 가지며 초대 플래그 설정과 같은 비즈니스 규칙을 관리합니다.

분명히 약간 애매하지만 적절한 해결 방법은 시나리오에 대한 세부 정보가 필요합니다. 너는 무엇인가? 기록은 어떻게 삽입됩니까? 작업 단위 (거래) 란 무엇입니까?

0

오류가 발생했다고 생각합니다.

SQL> declare 
    2 test number; 
    3 begin 
    4 select blocks into test from user_segments where segment_name='asdfasdfasdf'; 
    5 if test is not null then 
    6 test := 1; 
    7 end if; 
    8 end; 
    9/
declare 
* 
ERROR at line 1: 
ORA-01403: no data found 
ORA-06512: at line 4 

당신은 선택이없는 데이터를 발견 오류가 발생하지 않고 결과를 반환하지 않는 경우로 선택에서 변수를 테스트 할 수 없습니다 예를 들면 다음과 같습니다. 나는 보통 카운트를한다.

SQL> declare 
    2 test number; 
    3 begin 
    4 select count(blocks) into test from user_segments where segment_name='asdfasdfasdf'; 
    5 if test > 0 then 
    6  select blocks into test from user_segments where segment_name='asdfasdfasdf'; 
    7  test := 1; 
    8 end if; 
    9 end; 
10/

PL/SQL procedure successfully completed. 

존재하는 테이블의 선택 개수는 값을 반환합니다.

바비

+0

글쎄, PETS 테이블에서 null로 필드 값을 업데이트하려고 시도했지만 NO로 변경되었지만 값을 다시 업데이트하려고 시도했을 때 초대 부분이 여전히 작동하지 않았습니다./ – Kim

+0

Ok. 나는 잘 모르겠다. 코드를 살펴보면 "ORA-01403 : 데이터를 찾을 수 없습니다"오류가 발생하지 않는 것처럼 보입니다. 나는 일반적으로 선택을하기 전에 동일한 기준으로 계산합니다. 그러나 관련이없는 문제가있을 수 있습니다. –

+1

아니요 "데이터를 찾을 수 없음"오류가 발생하고 UR 단계를 수행했지만 해결되었지만 원하는 작업을 수행하지 못했습니다. : / – Kim