Oracle

帶觸發器的“SQL 命令未正確結束”

  • September 3, 2020

問題

無論我做什麼,我都無法讓我的觸發器工作。似乎總是抱怨 SQL 命令沒有正確結束,忽略 SQL 語句等等。

研究

我花了幾個小時研究為什麼會出現這個問題,但我仍然空手而歸。這是我第一次創建觸發器,所以我覺得它與放置東西有關。

我試過的

我已經嘗試了很多很多東西。我嘗試在括號中的最後一個變數中添加逗號,我嘗試添加 ; 隨機陳述等等。這是我的觸發器:

CREATE OR REPLACE TRIGGER create_base_invoice
AFTER INSERT ON reservation
BEGIN
   INSERT INTO 
       invoice 
   VALUES
       (i.resnum, i.bnum, i.rnum, c.cfname, c.clname, i.bstartdate, null, null)
   SELECT 
       i.resnum, i.bnum, i.rnum, c.cfname, c.clname, i.bstartdate
   FROM 
       INSERTED i, CUSTOMER c
   WHERE(
      (i.cfname = c.cfname)
      AND
      (i.clname = c.clname)
       );
END create_base_invoice;

在我的情況下,我不理解 SELECT 命令的意義,我嘗試將其刪除,但我沒有收到不同的錯誤,所以我不確定我是否需要它。

我添加它的原因是偶然發現了一篇與我的場景非常相似的文章,並看到答案包含我當時失踪的 SELECT 語句。

我需要 where 子句的原因是因為 Reservation 表實際上並不包含客戶姓名和姓氏(在這種情況下我們需要)。它只保存客戶編號。這是預訂表:

RESNUM
CNUM
BNUM
RNUM
BSTARTDATE
BDURATION
BOCCUPANTS
BSTATUS
BPAYMENT

我刪除了該VALUES子句,現在錯誤是

3/78 PL/SQL:ORA-01747:無效的 user.table.column、table.column 或列規範

我也刪,null ,null了。然後它抱怨

缺少 VALUES 關鍵字


所以,我想做的是根據預訂創建發票。當有人預訂預訂時,觸發器會保存預訂中的某些變數(resnum、bnum、rnum、bstartdate、cnum),然後根據客戶編號(cnum)查找客戶全名。

所有這些都保存到發票中以製作基本發票。然後我有另一個程序,添加結帳日期併計算總住宿價格。我們不會將 cnum 保存到發票中。

澄清一下,cnum 本質上只是用於搜尋客戶並找到他們的名字和姓氏,然後將其保存到發票上。

(編輯以下評論並檢查 SQL Server 中的 INSERTED 內容後)

SQL Server 中的INSERTED表表示由觸發語句插入的行。甲骨文沒有這個。相反,行級觸發器可以引用受觸發器影響的每一行的列值,使用:new:old值。(只:new為插入填充值,並且只:old為刪除填充。)因此我認為你需要的是這樣的:

create or replace trigger create_base_invoice
after insert on reservation
for each row
begin
   insert into invoice
        ( resnum
        , bnum
        , rnum
        , cfname
        , clname
        , bstartdate)
   select :new.resnum
        , :new.bnum
        , :new.rnum
        , c.cfname
        , c.clname
        , :new.bstartdate
   from   customer c
   where  c.cnum = :new.cnum;
end create_base_invoice;

這將為每個新預訂創建一張發票,包括從客戶表中查找的詳細資訊。

我不明白 SELECT 命令的意義

有兩種口味insert

insert into tablename (col1, col2, col3) values (val1, val2, col3)

insert into tablename (col1, col2, col3)
select t2.col1, t2.col2, t2.col3
from   othertable t2
where  ...

一種用於插入固定值,另一種用於從查詢中載入結果。

引用自:https://dba.stackexchange.com/questions/274838