2010-04-07 51 views
2

當我們嘗試在函數內創建視圖時,我們得到錯誤:沒有參數$ 1。這是示例代碼。

Begin 

CREATE VIEW artikelnr AS 
SELECT datum, 'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven" 
FROM uitgifteregel 
JOIN artikel ON artikel.artikelnr = new.artikelnr 
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 

UNION 
SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven" 
FROM ontvangstregel 
JOIN artikel ON artikel.artikelnr = new.artikelnr 
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; 
Return new; 
end; 

當我們更換new.artikelnr與價值1它像它應該第7行,但功能需要與不同的artikelnr的工作。

例如7號線:JOIN artikel ON artikel.artikelnr = new.artikelnr

請爲我們指出了正確的方向。

迴應:我們必須創建此視圖用於教育目的。我已經上傳的 視圖的圖像和我們的數據庫的tablestructure:

http://img208.imageshack.us/img208/5655/tablesk.jpg

我們的第一個目標是創造 一個ARTIKEL視圖。我們用下面的代碼來實現這一點:

CREATE VIEW artikelmutatiestotaal AS 
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven" 
FROM uitgifteregel, ontvangstregel 
UNION 
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven" 
FROM uitgifteregel 
JOIN artikel ON artikel.artikelnr = 1 
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 
UNION 
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven" 
FROM ontvangstregel 
JOIN artikel ON artikel.artikelnr = 1 
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr 

我們不可能取得唯一一件事就是讓artikelnr的價值我們的INSERT語句。

CREATE FUNCTION addview() returns trigger as ' 
Begin 
CREATE VIEW artikelnr AS 
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven" 
FROM uitgifteregel, ontvangstregel 
UNION 
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven" 
FROM uitgifteregel 
JOIN artikel ON artikel.artikelnr = new.artikelnr 
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 
UNION 
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven" 
FROM ontvangstregel 
JOIN artikel ON artikel.artikelnr = artikelnr 
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr 
end; 
'language plpgsql; 

當我們與

JOIN artikel ON artikel.artikelnr = 1 

取代JOIN artikel ON artikel.artikelnr = new.artikelnr 第7行,它工作正常。抱歉發佈我的問題非常結構化。我不知道哪些信息對於回答這個問題很重要。

+0

查看我的回答的新編輯 – zendar 2010-04-08 09:00:05

+0

爲什麼你想創建許多不同的意見,同名?這是行不通的。每個視圖只是一個不同的artikelnr?你的目標是什麼?你試圖解決的根本問題是什麼? – 2010-04-08 10:17:27

回答

0

這是什麼數據庫?

這是什麼new關鍵字?此代碼是否從某個觸發器複製?

  • JOIN條款替換new用正確的表名。
  • 刪除Return new;

如果我沒有記錯,MSACCESS當你拼錯字段名報告類似的錯誤。
接下來的事情是檢查所有的字段名稱。或者,使用一些可視化查詢構建器並創建這些聯合查詢以確保所有字段名稱都正確。

我認爲你可以失去這些CASE語句,寫只是0 AS "Some Fieldname"

試試這個。它應該工作。 (我沒有針對數據庫進行測試)

CREATE OR REPLACE VIEW artikelnr AS 
    SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen", 
     aantal as "aantal uitgegeven" 
    FROM uitgifteregel 
    JOIN artikel ON artikel.artikelnr = uitgifteregel.artikelnr 
    JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 

UNION 
    SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , 
     0 as "aantal uitgegeven" 
    FROM ontvangstregel 
    JOIN artikel ON artikel.artikelnr = ontvangstregel.artikelnr 
    JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; 

編輯:
我不知道很多關於PostgreSQL的,但你可能應該考慮EXECUTE SCRIPT - 發送artikelnr作爲參數,然後構建DDL的視圖腳本。

根據我對其他數據庫(Oracle和SQL服務器)的經驗,我認爲你不應該爲每條記錄創建一個視圖。你想用這種方法完成什麼?

如果目標是具有預編譯視圖和此增益執行速度,則參數化查詢可能會實現同樣的效果。將其存入存儲過程併發送artikelnr作爲參數。

如果不是因爲性能原因,你能解釋一下爲什麼你這樣做。

編輯2:
回答:您不能以這種方式創建視圖。問題在於CREATE VIEW需要語句而不替換值 - 它嘗試使用new.artikelnr創建視圖,然後由於觸發器外沒有表new而失敗。您需要將語句構造爲字符串或文件,然後執行該語句。我檢查了PostgreSQL的文檔,並且有用於構建和執行動態命令的命令EXECUTE。像這樣的東西或許應該工作:

EXECUTE 
    'CREATE OR REPLACE VIEW artikelnr AS ' 
    || ' SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen",' 
    || ' aantal as "aantal uitgegeven" ' 
    || ' FROM uitgifteregel ' 
    || ' JOIN artikel ON artikel.artikelnr = ' 
    || new.artikelnr 
    || ' JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr ' 
    || ' UNION ' 
    || ' SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , ' 
    || '  0 as "aantal uitgegeven" ' 
    || ' FROM ontvangstregel ' 
    || ' JOIN artikel ON artikel.artikelnr = ' 
    || new.artikelnr 
    || ' JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; ' 

這是一個巨大的concat與插在正確的地方new.artikelnr值。它將artikelnr的字面值「插入」SQL代碼,然後獲取通過EXECUTE語句執行的SQL。

請注意,上面的代碼並不關心引用,它絕對不會按原樣工作(因爲這個例子是用於教育目的,所以請讀者將其改正爲練習:)。

documentation for EXECUTE statement中,您將找到使用引用函數的示例,這些函數應該用於正確構造上述命令。

+0

感謝您的快速響應。我們使用的數據庫是postgresql。這段代碼的功能是通過以下觸發器執行 。 CREATE TRIGGER addview 後插入artikel爲EACH行 EXECUTE PROCEDURE addview(); 當我們插入一個新的artikel時,觸發器就會工作。 artikelnr的含義與productnr相同。 artikelnr是artikel表的主要關鍵。 new.artikelnr在我們的insert語句中引用artikelnr。我希望這能清除一些事情。 – user311064 2010-04-07 16:21:25

+0

嗨。我編輯了這篇文章,因爲評論留下的空間太小,無法添加信息。我希望這是有幫助的。 – user311064 2010-04-08 08:19:48

+0

感謝您的幫助。我將查找文檔並使用execute語句。 – user311064 2010-04-08 11:38:58

相關問題