2011-02-01 13 views
14

मेरे पास है:PostgreSQL उत्प्रेरक त्रुटि

DELETE FROM "Podania" 

I get 

ERROR: record "old" is not assigned yet 
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate. 
CONTEXT: PL/pgSQL function "aktualizujiloscpodan" line 11 at assignment 

********** Błąd ********** 

ERROR: record "old" is not assigned yet 
Stan SQL:55000 
Szczegóły:The tuple structure of a not-yet-assigned record is indeterminate. 
Kontekst:PL/pgSQL function "aktualizujiloscpodan" line 11 at assignment 

ऐसा लगता है ऐसा लगता है जैसे OLD या NEW है क्या पता नहीं है:

CREATE OR REPLACE FUNCTION aktualizujIloscPodan() RETURNS TRIGGER AS 
$BODY$ 
    DECLARE 
    n integer; 
    sid integer; 
BEGIN 

sid=0; 
IF (TG_OP='INSERT') THEN 
sid = NEW."studentID"; 
ELSIF (TG_OP='DELETE') THEN 
sid = OLD."studentID"; 
END IF; 

n = COALESCE ((SELECT count("studentID") as c 
FROM "Podania" WHERE "studentID"=sid 
GROUP BY "studentID"), 0); 

UPDATE "Studenci" SET "licznikpodan" = n WHERE "ID"=sid; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS triggenPodan ON "Podania"; 

CREATE TRIGGER triggenPodan AFTER INSERT OR DELETE 
ON "Podania" 
EXECUTE PROCEDURE aktualizujIloscPodan(); 

जब मैं निष्पादित करने के लिए प्रयास करें। मैं कैसे इसे ठीक कर सकता हूं?

उत्तर

18

आप का उपयोग करने के FOR EACH ROW

CREATE TRIGGER triggerPodan AFTER INSERT OR DELETE 
ON "Podania" FOR EACH ROW 
EXECUTE PROCEDURE aktualizujIloscPodan(); 
+1

ओह मैन, यह इतना स्पष्ट है .... धन्यवाद :) –

12

delete ट्रिगर केवल OLD रिकॉर्ड को परिभाषित किया गया है और NEW अपरिभाषित है। तो, कोड में, जांचें कि ट्रिगर DELETE या INSERT (चर TG_OP) के रूप में चल रहा है या उचित रिकॉर्ड तक पहुंच रहा है या नहीं।

इसके अलावा, अगर आप इस तरह, बिल्कुल यहां गिनती के बिना जा सकते हैं:

CREATE OR REPLACE FUNCTION aktualizujIloscPodan() RETURNS TRIGGER AS 
$BODY$ 
DECLARE 
    n integer; 
BEGIN 
    IF TG_OP = 'INSERT' then 
     UPDATE "Studenci" SET "ilosc_podan" = "ilosc_podan" + 1 WHERE "ID"=NEW."studentID"; 
    ELSIF TG_OP = 'DELETE' then 
     UPDATE "Studenci" SET "ilosc_podan" = "ilosc_podan" - 1 WHERE "ID"=OLD."studentID"; 

    END IF; 
END; 

$BODY$ 
LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS triggenPodan ON "Podania"; 

CREATE TRIGGER triggenPodan AFTER INSERT OR DELETE 
ON "Podania" 
EXECUTE PROCEDURE aktualizujIloscPodan(); 
+0

ठीक की जरूरत है, शायद मैं गिनती करने के लिए की जरूरत नहीं है ... संशोधित मेरा कोड और एक और त्रुटि मिली। क्या आप मदद कर सकते हैं? दो चीजें: यह वापस लौटने की अनुमति नहीं देता है (बिना वापसी के काम करता है) और यह 'ELIFIF'' ELIF' नहीं है –

+0

@ मिको क्षमा करें, मैंने इसे जांच नहीं लिया। संपादित। –

+0

@ माइको ट्रिगर्स के बाद वापसी मूल्य की आवश्यकता नहीं है। –

संबंधित मुद्दे