我正在尝试创建一个触发器,当一个新行插入到表中时会触发该触发器。触发器应检查该表是否有任何行,其列中的值等于插入行中同一列的值。然后我需要更新原始表中与所选行具有相同ID的行。现在我需要提出检索数据(所有列)的请求,以及当我遇到麻烦时的那些。
问题是我需要声明一个变量,用于存储该请求的结果。该变量应该与我从中检索数据的表具有相同的类型,但是当我声明它时(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"
我实际上可以检索我需要的数据,但仅限于表中只有1行符合要求的情况。这是一个样本:
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;
如何获取所有行?感谢。
答案 0 :(得分:1)
如果我理解你正确,你试图声明一个表类型的变量。您的问题是该变量不是%TYPE而是%ROWTYPE。
DECLARE
emp_rec scott.emp%ROWTYPE;
BEGIN
.....
END;
/
你的第二个要求非常令人困惑。删除条件以获取所有行。你需要更具体和清晰。