2016-11-04 4 views
0

새 행을 테이블에 삽입 할 때 발생하는 트리거를 만들려고합니다. 트리거는 해당 테이블에 삽입 행의 동일한 열의 값과 같은 열이있는 행이 있는지 확인해야합니다. 그런 다음 선택한 테이블과 동일한 ID를 가진 원본 테이블의 행을 업데이트해야합니다. 이제는 데이터 (모든 열)를 검색하라는 요청을해야합니다. 그러면 문제가 발생합니다.PL/SQL은 Oracle에서 SELECT INTO를 사용하여 여러 행을 검색합니다.

문제는 해당 요청의 결과를 저장하는 데 사용되는 변수를 선언해야한다는 것입니다. 그 변수는 않습니다에서 내가 데이터를 검색 할 테이블과 동일한 유형이 있어야합니다,하지만 난 그런 식으로 그것을 선언 할 때 (REC_ROAD_INT 내 테이블) :

DECLARE REQUEST_RESULT REC_ROAD_INT%TYPE;

내가

%TYPE must be applied to a variable, column, field or attribute, not to "REC_ROAD_INT"

수 실제로 필자는 필요한 데이터 만 검색 할 수 있지만 테이블에 요구 사항을 충족하는 행이 하나 밖에없는 경우에만 검색 할 수 있습니다. 다음은 샘플입니다.

create or replace TRIGGER INSERT_ROAD_TRIGGER 
BEFORE INSERT ON REC_ROAD_INT 
FOR EACH ROW 
DECLARE 
    ROAD_ID NUMBER; 
    ROAD_NAME VARCHAR2(20); 
    ROAD_START_KM NUMBER; 
    ROAD_END_KM NUMBER; 
BEGIN 
    SELECT ID, NAME, START_KM, END_KM INTO ROAD_ID, ROAD_NAME, ROAD_START_KM, ROAD_END_KM 
    FROM REC_ROAD_INT 
    WHERE (:NEW.START_KM BETWEEN START_KM AND END_KM) OR 
     (:NEW.END_KM BETWEEN START_KM AND END_KM); 
    IF INSERTING 
    THEN 
     DBMS_Output.Put_Line('INSERTING'); 
     DBMS_Output.Put_Line('Inserting road: ' || :NEW.ID || ' ' || :New.NAME || ' ' || :New.START_KM || ' ' || :New.END_KM); 
     DBMS_Output.Put_Line('Crossing road: ' || 'ID = ' || ROAD_ID || ', NAME = ' || ROAD_NAME || 
       ', START_KM = ' || ROAD_START_KM || ', END_KM = ' || ROAD_END_KM); 
    END IF; 
END; 

어떻게하면 모든 행을 가져올 수 있습니까? 감사.

+1

복합 트리거를 찾고있는 것처럼 '커서' –

+2

소리가 들릴 수 있습니다. http://viralpatel.net/blogs/compound-triggers-in-oracle-11g-tutorial-example/ –

+0

@Akio Hamasaki, that 's 좋은 생각, 나는 그것을 시도 할 것이다 –

답변

1

올바르게 이해하면 테이블 유형의 변수를 선언하려고합니다. 문제는 그 변수가 % TYPE이 아니라 % ROWTYPE이라는 ​​것입니다.

DECLARE 
    emp_rec scott.emp%ROWTYPE; 
BEGIN 
..... 
END; 
/

두 번째 요구 사항은 매우 혼란 스럽습니다. 조건을 제거하여 모든 행을 가져옵니다. 좀 더 구체적이고 명확해야합니다.

+0

불행히도 나는'WHERE' 조건을 제거 할 수 없다. 왜냐하면 그 조건을 만족하는 행만을 원한다. 문제는 여러 행이있을 수 있다는 것이다. –

+0

그렇다면 무엇이 문제인가? 명시 적 커서 및 루프를 열고 필요한 모든 것을 얻습니다. 오라클 책이나 웹을 열고 암시 적 커서와 암시 적 커서의 차이점을 읽으십시오. – Art

+0

나는 내 질문에 그것을 언급하는 것을 잊어 버렸지 만, 내 테이블의 요구 사항을 충족하는 행을 업데이트해야하지만, 실제로 뭔가를 삽입하는 경우에만 (이는 내가 IF 삽입이 내 코드에 포함 된 이유입니다.) 문제는 당신이 IF' 문'의 내부에'SELECT' 절을 사용할 수 없습니다, 그래서 외부 그것을 어딘가에 결과를 저장해야합니다. –