Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入之前的Oracle触发器找不到数据_Sql_Oracle - Fatal编程技术网

Sql 插入之前的Oracle触发器找不到数据

Sql 插入之前的Oracle触发器找不到数据,sql,oracle,Sql,Oracle,如果账单已经支付,我试图触发一个触发器,阻止您在“Bill\u Item”表中插入新的账单项。账单表中有一个Paid_YN和一个Posted_YN列。因此,根据您将要添加到的账单,如果该账单已经支付或过账,它将拒绝该账单。我的更新和删除部分在此代码范围内工作,但不是“插入”部分。请帮忙!很抱歉没有缩进,无法正确复制代码。 请告诉我哪里出了问题!这是我的逻辑吗?我已经尝试过在这里搜索错误信息,但仍然无法找到它 表格:: CREATE TABLE Bill ( Bill_Number NUMBER

如果账单已经支付,我试图触发一个触发器,阻止您在“Bill\u Item”表中插入新的账单项。账单表中有一个Paid_YN和一个Posted_YN列。因此,根据您将要添加到的账单,如果该账单已经支付或过账,它将拒绝该账单。我的更新和删除部分在此代码范围内工作,但不是“插入”部分。请帮忙!很抱歉没有缩进,无法正确复制代码。 请告诉我哪里出了问题!这是我的逻辑吗?我已经尝试过在这里搜索错误信息,但仍然无法找到它

表格::

CREATE TABLE Bill (
Bill_Number NUMBER (6,0)
CONSTRAINT Bill_pk PRIMARY KEY
CONSTRAINT Bill_Number_NN NOT NULL,
Bill_Date DATE DEFAULT SYSDATE
CONSTRAINT Bill_Date_NN NOT NULL,
Waiter_Number NUMBER (5,0)
CONSTRAINT Bill_Waiter_Number_FK REFERENCES Waiter (Waiter_Number)
CONSTRAINT Bill_Waiter_Number_NN NOT NULL,
Table_Number NUMBER (2,0)
CONSTRAINT Bill_Table_Number_NN NOT NULL,
Customer_Count NUMBER (2,0) DEFAULT 1
CONSTRAINT Bill_Customer_Count_CK CHECK (Customer_Count > 0)
CONSTRAINT Bill_Customer_Count_NL NULL,
Paid_YN CHAR (1) DEFAULT 'N'
CONSTRAINT Bill_Paid_YN_CK CHECK ((Paid_YN = 'Y') OR (Paid_YN = 'N'))
CONSTRAINT Bill_Paid_YN_NN NOT NULL,
Posted_YN CHAR (1) DEFAULT 'N'
CONSTRAINT Bill_Posted_YN_CK CHECK ((Posted_YN = 'Y') OR (Posted_YN = 'N'))
CONSTRAINT Bill_Posted_YN_NN NOT NULL,
Bill_GST NUMBER (6,2) DEFAULT 0
CONSTRAINT Bill_GST_CK CHECK (Bill_GST >= 0)
CONSTRAINT Bill_GST_NN NOT NULL,
Bill_Total NUMBER (8,2) DEFAULT 0
CONSTRAINT Bill_Total_CK CHECK (Bill_Total >= 0)
CONSTRAINT Bill_Total_NN NOT NULL
);

CREATE TABLE Bill_Item (
Bill_Number NUMBER (6,0)
CONSTRAINT BItem_Bill_Number_FK REFERENCES Bill (Bill_Number)
CONSTRAINT BItem_Bill_Number_NN NOT NULL,
Menu_Item_Number NUMBER (5,0)
CONSTRAINT BItem_Menu_Item_Number_FK REFERENCES Menu_Item (Menu_Item_Number)
CONSTRAINT BItem_Menu_Item_Number_NN NOT NULL,
Discount NUMBER (5,2) DEFAULT 0
CONSTRAINT BItem_Discount_CK CHECK ((Discount >= 0 ) AND (Discount <= 100))
CONSTRAINT BItem_Discount_NL NULL,
Quantity_Sold NUMBER (3,0) DEFAULT 1
CONSTRAINT BItem_Quantity_Sold_CK CHECK (Quantity_Sold > 0)
CONSTRAINT BItem_Quantity_Sold_NN NOT NULL,
Selling_Price NUMBER (6,2) DEFAULT 0
CONSTRAINT BItem_Selling_Price_CK CHECK (Selling_Price >= 0)
CONSTRAINT BItem_Selling_Price_NN NOT NULL,
CONSTRAINT Bill_Item_PK PRIMARY KEY (Bill_Number, Menu_Item_Number)
);
此插入返回:

Insert Into Bill_Item
    (Bill_Number, Menu_Item_Number, Discount, Quantity_Sold, Selling_Price)
Values
  (4945, 2, 0, 1, 1.03);


Error starting at line : 234 in command -
Insert Into Bill_Item
    (Bill_Number, Menu_Item_Number, Discount, Quantity_Sold, Selling_Price)
Values
   (4945, 2, 0, 1, 1.03)
Error report -
SQL Error: ORA-01403: no data found
ORA-06512: at "ORCL1_05.TR_Q5", line 24
ORA-04088: error during execution of trigger 'ORCL1_05.TR_Q5'
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of 
fetch.
这是你的灯笼裤:

  ELSIF INSERTING THEN
    SELECT Paid_YN, Posted_YN
    INTO v_paid_YN, v_Posted_Yn
    FROM Bill
    WHERE Bill_Number = :OLD.Bill_Number;
在插入过程中,
:old
命名空间为空。这是完全合乎逻辑的:我们正在插入一条记录,旧记录还能是什么

因此,解决方案非常简单

  ELSIF INSERTING THEN
    SELECT Paid_YN, Posted_YN
    INTO v_paid_YN, v_Posted_Yn
    FROM Bill
    WHERE Bill_Number = :NEW.Bill_Number;
:旧的
在更新和删除时有效,这就是这些分支工作的原因。(通常在更新时测试当前值:新值,除非检查值是否已更改。)

这是您的灯笼裤:

  ELSIF INSERTING THEN
    SELECT Paid_YN, Posted_YN
    INTO v_paid_YN, v_Posted_Yn
    FROM Bill
    WHERE Bill_Number = :OLD.Bill_Number;
在插入过程中,
:old
命名空间为空。这是完全合乎逻辑的:我们正在插入一条记录,旧记录还能是什么

因此,解决方案非常简单

  ELSIF INSERTING THEN
    SELECT Paid_YN, Posted_YN
    INTO v_paid_YN, v_Posted_Yn
    FROM Bill
    WHERE Bill_Number = :NEW.Bill_Number;

:旧的
在更新和删除时有效,这就是这些分支工作的原因。(除了检查值是否已更改外,更新时通常会测试当前的-
:new
-值。)

插入时是否应使用:new.Bill\u编号?另外,如果这是一条全新的记录,您必须检查未发现数据时的异常:
未发现数据时的异常
插入时是否应该使用:new.Bill\u编号?此外,如果这是一条全新的记录,您必须检查未发现数据时的异常:
未发现数据时的异常
非常感谢!这样解释就有意义了!非常感谢你!这样解释就有意义了!