2012-05-03 40 views
0

我目前有一個問題實現一個簡單的任務,其中一個現有的客戶的新工作,直到他們還清債務時才被批准。我認爲這會很簡單,直到我發現SQL-92斷言在Oracle中不工作... ...SQL/Oracle 10g - 問題與斷言

我環顧網絡,看到有可能做同樣的事情,但與觸發器/檢查約束。然而,我完全失去了如何實現這一目標。

我的數據庫的結構,像這樣:

Table invoice is in a one-to-many relationship with jobs 
Table jobs is in a many-to-one relationship with client 

目前我有:

CREATE TRIGGER check_debt 
BEFORE UPDATE ON jobs 
FOR EACH ROW 
WHEN ((SELECT * FROM client WHERE clientNo = 
(SELECT * FROM jobs WHERE jobNo = 
(SELECT * FROM invoice WHERE status = 'Debt Owing')))) 
COMMIT; 

正如你所看到的,我不知道如何來模擬一個觸發斷言.. 。

任何幫助表示讚賞!

謝謝。

注意:我在練習使用SQL-92和SQL-99標準。

+0

你能用文字解釋你試圖在這個觸發器中斷言什麼嗎?我很難理解這個觸發器的目標是什麼。這可能也有助於在這裏定義四個表格('client','jobNo','invoice'和'jobs') –

+0

對不起,實際上有3個表格(jobNo應該是工作......我的壞話)。基本上,我想斷言,除非他們以前的工作發票已經支付(因此發票中的狀態是「債務欠款」),否則不能從現有客戶接受工作(客戶有多個工作提議)。希望清除它更高技能 – tester

回答

1

當您對作業進行更新時,包括查詢以檢查發票的狀態。

update jobs 
    set ... 
where ... -- logic to select job to update 
and not exists (
     select * 
     from invoice 
     where ... -- insert join condition 
     and status = 'Debt Owing') 

然後檢查一行是否已更新(方法取決於您使用的客戶端)。

+0

我可以看看這將如何工作,但我使用sqldeveloper,只是使用接口來插入/更新/刪除行 – tester

+0

sqldeveloper允許您運行更新語句 - 只需粘貼到sql編輯器並點擊綠色的「運行」按鈕。 –