2016-11-04 7 views
0

Я пытаюсь создать триггер, который запускается, когда новая строка вставляется в таблицу. Триггер должен проверить, есть ли в этой таблице какие-либо строки, которые имеют значение в столбце, которое равно значению из того же столбца в строке вставки. Затем мне нужно обновить строки в исходной таблице с тем же идентификатором, что и выбранные. Теперь мне нужно сделать запрос на извлечение данных (все столбцы), и именно тогда у меня возникают проблемы.PL/SQL извлекает несколько строк с помощью SELECT INTO в Oracle

Проблема в том, что мне нужно объявить переменную, которая будет использоваться для хранения результата этого запроса. Эта переменная должна иметь тот же тип, что и таблица I извлечения данных из делает, но когда я объявляю это так (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

@ Акио Хамасаки, это хорошая идея, я попробую, что –

ответ

1

Если вы правильно поняли, что пытаетесь объявить переменную типа таблицы. Ваша проблема в том, что эта переменная не является% TYPE, а% ROWTYPE.

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

Ваше второе требование довольно запутанно. Удалите условие, чтобы получить все строки. Вы должны быть более конкретными и понятными.

+0

К сожалению, я не могу удалить условие 'WHERE', потому что мне нужны только те строки, которые соответствуют этому условию, проблема в том, что может быть несколько строк. –

+0

Тогда в чем проблема? Откройте явный курсор и цикл и получите все, что вам нужно. Откройте любую книгу Oracle или сеть и прочитайте разницу между неявными и явными курсорами. – Art

+0

Я как бы забыл упомянуть об этом в своем вопросе, но мне также нужно обновить те строки, которые отвечают требованиям в моей таблице, но только если я действительно вставляю что-то (поэтому у меня есть 'IF INSERTING' в моем коде. проблема заключается в том, что вы не можете использовать предложение 'SELECT' внутри оператора' IF', поэтому мне нужно сделать это снаружи и где-нибудь где-то где-то хранить. –