Plsql 如何摆脱坏绑定操作符、if条件的问题?

Plsql 如何摆脱坏绑定操作符、if条件的问题?,plsql,Plsql,如果情况属实,我需要阻止船长和副驾驶 CREATE OR REPLACE TRIGGER noPilot BEFORE INSERT OR UPDATE ON flight FOR EACH ROW DECLARE captainS varchar2(5); firstOfficerS varchar2(5); BEGIN Select F.captainStaffID into captainS from Flight.F where F.StaffID = captai

如果情况属实,我需要阻止船长和副驾驶

CREATE OR REPLACE TRIGGER noPilot
BEFORE INSERT OR UPDATE ON flight
FOR EACH ROW

DECLARE
    captainS varchar2(5);
    firstOfficerS varchar2(5);

BEGIN

Select F.captainStaffID
into captainS
from Flight.F
where F.StaffID = captainS;

select F.firstOfficerStaffID
into firstOfficerS
from Flight F
where F.StaffID = firstOfficerS;

If(UPPER(:old.pilotYesNo = 'N')) THEN
    RETURN 'No pilot to launch'; 

elsif(:old.qualification = 'ATPL') THEN
    RETURN 'No qualifications';

    ENDIF;
END nopilot;
/



17/10    PLS-00049: bad bind variable 'OLD.PILOTYESNO'
20/7     PLS-00049: bad bind variable 'OLD.QUALIFICATION'
24/5     PLS-00103: Encountered the symbol "NOPILOT" when expecting one of
     the following:
     if
上述表格如下:

航班(飞行ID、estDepartureDateTime、ActDepartureDateTime、actArriveDateTime、平均速度、平均高度、estDuration、estFuel、拖运类型、机长、第一官员、航路ID、飞机ID)


员工(职员、姓名、地址、电子邮件、电话、护照号码、飞行员编号、prevHrsPilotExp、attendantYesNo、memberID)

航班表上似乎没有
飞行员编号
资格
字段。您可能需要编辑您的问题并包括
航班
表的定义,以便人们能够更好地理解它

此外,触发器不返回值,因此
return
语句在触发器中无效。也许你应该在这里提出一个例外

此外,当执行此触发器时,您可能会在运行时得到一个
变异表
异常,因为您在INSERT或UPDATE
行触发器之前定义了一个
,在该行触发器中,您正在从定义触发器的同一个表(
FLIGHT
)中选择触发器主体中的数据。这在Oracle中是不允许的。也许您应该引用
:NEW
伪行中的值

更好的解决方案是在尝试执行适当的插入或更新之前,定义一个执行所有必要检查等的过程(可能名为
插入\u或\u更新\u FLIGHT
)。将业务逻辑放在触发器中是一个简单的过程

祝你好运

编辑 如前所述,根据问题中添加的表格定义,
FLIGHT
表格中没有
PILOTYESNO
QUALIFICATION
字段<代码>飞行员编号
员工
表上的字段,而不是
航班
上的字段。在
航班
员工
表上都没有
资格
字段,因此我不知道该推荐什么。这里还有其他没有提到的桌子吗

无论如何,我认为你可以通过以下方式更接近你想要的:

CREATE OR REPLACE TRIGGER FLIGHT_BIU
  BEFORE INSERT OR UPDATE ON FLIGHT
  FOR EACH ROW
DECLARE
  strMAX_PILOTYESNO  STAFF.PILOTYESNO%TYPE;
BEGIN
  SELECT MAX(UPPER(PILOTYESNO))
    INTO strMAX_PILOTYESNO  
    FROM STAFF
    WHERE STAFFID IN (:NEW.CAPTAINSTAFFID, :NEW.FIRSTOFFICERSTAFFID);

  IF strMAX_PILOTYESNO  = 'N' THEN
    RAISE_APPLICATION_ERROR(-20000, 'No pilot assigned to the flight');
  END IF;

  -- Add code here to handle QUALIFICATION, wherever that may be found
END FLIGHT_BIU;
/

祝您好运。

航班
表上似乎没有
飞行员编号
资格
字段。您可能需要编辑您的问题并包括
航班
表的定义,以便人们能够更好地理解它

此外,触发器不返回值,因此
return
语句在触发器中无效。也许你应该在这里提出一个例外

此外,当执行此触发器时,您可能会在运行时得到一个
变异表
异常,因为您在INSERT或UPDATE行触发器之前定义了一个
,在该行触发器中,您正在从定义触发器的同一个表(
FLIGHT
)中选择触发器主体中的数据。这在Oracle中是不允许的。也许您应该引用
:NEW
伪行中的值

更好的解决方案是在尝试执行适当的插入或更新之前,定义一个执行所有必要检查等的过程(可能名为
插入\u或\u更新\u FLIGHT
)。将业务逻辑放在触发器中是一个简单的过程

祝你好运

编辑 如前所述,根据问题中添加的表格定义,
FLIGHT
表格中没有
PILOTYESNO
QUALIFICATION
字段<代码>飞行员编号
员工
表上的字段,而不是
航班
上的字段。在
航班
员工
表上都没有
资格
字段,因此我不知道该推荐什么。这里还有其他没有提到的桌子吗

无论如何,我认为你可以通过以下方式更接近你想要的:

CREATE OR REPLACE TRIGGER FLIGHT_BIU
  BEFORE INSERT OR UPDATE ON FLIGHT
  FOR EACH ROW
DECLARE
  strMAX_PILOTYESNO  STAFF.PILOTYESNO%TYPE;
BEGIN
  SELECT MAX(UPPER(PILOTYESNO))
    INTO strMAX_PILOTYESNO  
    FROM STAFF
    WHERE STAFFID IN (:NEW.CAPTAINSTAFFID, :NEW.FIRSTOFFICERSTAFFID);

  IF strMAX_PILOTYESNO  = 'N' THEN
    RAISE_APPLICATION_ERROR(-20000, 'No pilot assigned to the flight');
  END IF;

  -- Add code here to handle QUALIFICATION, wherever that may be found
END FLIGHT_BIU;
/

祝你好运。

我相信你需要将:old.pilotYesNo='N'改为:old.pilotYesNo='N',然后选择F.captainStaffID作为飞行中的机长。其中F.StaffID=机长;从F航班中选择F.StaffID为机长,其中F.StaffID=机长@Satya您突出显示的第二部分似乎是相同的东西顺便说一句,PL/SQL语法在
if
条件周围没有括号(它有一个
then
关键字`。编译器礼貌地忽略了代码中的括号。我认为您需要将:old.pilotYesNo='N'更改为:old.pilotYesNo='N',然后选择F.captainStaffID为captainS from Flight.F其中F.StaffID=captainS;从F航班中选择F.StaffID为机长,其中F.StaffID=机长@Satya您突出显示的第二部分似乎是相同的东西顺便说一句,PL/SQL语法在
if
条件周围没有括号(它有一个
then
关键字`。编译器礼貌地忽略了代码中的括号。非常感谢您精心制作的解释@Bob@bob如果你能找到我该修改的地方!我不知道这是不是非常感谢精心制作的解释@Bob@bob如果你能找到我该修改的地方!我也不知道