PL / SQL在Oracle中使用SELECT INTO检索多行

时间:2016-11-04 17:30:09

标签: sql oracle plsql dml database-trigger

我正在尝试创建一个触发器,当一个新行插入到表中时会触发该触发器。触发器应检查该表是否有任何行,其列中的值等于插入行中同一列的值。然后我需要更新原始表中与所选行具有相同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;

如何获取所有行?感谢。

1 个答案:

答案 0 :(得分:1)

如果我理解你正确,你试图声明一个表类型的变量。您的问题是该变量不是%TYPE而是%ROWTYPE。

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

你的第二个要求非常令人困惑。删除条件以获取所有行。你需要更具体和清晰。