帶觸發器的“SQL 命令未正確結束”
問題
無論我做什麼,我都無法讓我的觸發器工作。似乎總是抱怨 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 ...
一種用於插入固定值,另一種用於從查詢中載入結果。