Oracle 如何更正此错误,使其不会获取多条记录?

Oracle 如何更正此错误,使其不会获取多条记录?,oracle,function,plsql,triggers,procedure,Oracle,Function,Plsql,Triggers,Procedure,此过程代码用于对新插入应用折扣。我遇到的问题是获取的记录太多。我该如何解决这个问题?我使用触发器还是函数 好的,我已经创建了一个触发器,但是我是否收到了PLS-00103:在预期以下情况之一时遇到符号=:=。@% CREATE OR REPLACE PROCEDURE CHECK_DISCOUNT AS V_COUNT NUMBER; V_C_NO APPOINTMENT.C_NO%TYPE; V_BILL APPOINTMENT.BILL%TYPE; BEGIN SELECT C_NO,

此过程代码用于对新插入应用折扣。我遇到的问题是获取的记录太多。我该如何解决这个问题?我使用触发器还是函数

好的,我已经创建了一个触发器,但是我是否收到了PLS-00103:在预期以下情况之一时遇到符号=:=。@%

CREATE OR REPLACE PROCEDURE CHECK_DISCOUNT
AS

V_COUNT NUMBER;
V_C_NO APPOINTMENT.C_NO%TYPE;
V_BILL APPOINTMENT.BILL%TYPE;

BEGIN

SELECT C_NO,COUNT(C_NO)
INTO V_C_NO,V_COUNT
FROM APPOINTMENT
GROUP BY C_NO;

SELECT BILL
INTO V_BILL
FROM APPOINTMENT;

IF V_COUNT=3 THEN
V_BILL:=V_BILL * 0.9;
END IF;

UPDATE APPOINTMENT
SET BILL = V_BILL 
WHERE C_NO=:new.C_NO;
COMMIT;

END;
/

Create or replace TRIGGER CHECK_DISCOUNT 
BEFORE INSERT OR UPDATE OF C_NO ON APPOINT     
FOR EACH ROW 

DECLARE CURSOR C_APPTMENT IS 
SELECT C_NO,COUNT(C_NO) 
FROM APPOINTMENT GROUP BY C_NO; 

VISIT NUMBER; V_C_NO APPOINTMENT.C_NO%TYPE; 
V_BILL APPOINTMENT.BILL%TYPE; 
V_TEN NUMBER(3):=0.9; 

BEGIN 
   LOOP 
            OPEN C_APPTMENT; FETCH C_APPTMENT INTO V_C_NO, VISIT;
            EXIT WHEN C_APPTMENT%NOTFOUND; 

  SELECT BILL INTO V_BILL FROM APPOINTMENT; 
  IF VISITS =3 THEN V_BILL=V_BILL * V_TEN 
  WHERE :NEW.C_NO=V_C_NO; 
  UPDATE APPOINTMENT SET BILL:= V_BILL 
  WHERE:NEW.C_NO=V_C_NO; 
    END LOOP; 
      CLOSE C_APPTMENT; 

结束

使用“选择”时。。。您必须确保只选择一行。 通常,您将添加带有主键列或唯一键列的where子句。这样您就可以确保只选择一行。您还必须提供没有选择行的实例。添加异常处理程序以捕获未找到的异常

declare
   v_bill appointment.bill%type;
begin
   begin
      select a.bill
        into v_bill
        from appointment a
       where a.id = :my_id;  -- assuming ID is a primary key colomn
   exception
      when no_data_found then
         null;
   end;

   if v_bill is not null
   then
      --.. do something with v_bill
   end if;
end;

你想干什么?不清楚是要更新所有行、行的子集还是单行。此代码不正确。您有:new,它只能在触发器中使用。请发布一个在Oracle中至少语法正确且相当简单的示例:它编译时没有错误。@VincentMalgrat我正在尝试更新一行最新的触发器检查折扣,然后插入或更新C_NO ON Assignment,每行声明游标C_应用程序是按C_NO从约会组中选择C_NO,COUNTC_NO;探访次数;V_C_无约会。C_无%类型;V_账单预约。账单%类型;V_十个数字3:=0.9;V_TWE数3:=0.8;V_THR编号3:=0.7;开始循环开放式空调装置;在V_C_NO.中获取C_配件,访问;未找到C_应用程序%时退出;从约会中将账单选择为V_账单;如果访问次数=3,则V_BILL=V_BILL*V_TEN其中:NEW.C_NO=V_C_NO;更新约会集账单:=V_账单,其中:NEW.C_NO=V_C_NO;端环;关闭C_装置;终止在对最新账单应用折扣但获得PLS-00103的触发器上方:在预期以下情况之一时遇到符号=:=。@%@万古霉素