ऐसा लगता है कि आप एक PL/PgSQL
चलाने की कोशिश कर रहे हैं। कोड ब्लॉक स्टैंड-अलोन, इसे <का उपयोग करके फ़ंक्शन में लपेटे बिना। कोड>फ़ंक्शन बनाएं या बदलें
. यह काम नहीं करेगा, आपको इसे किसी फ़ंक्शन में शामिल करना होगा या (PostgreSQL 9.0 से) a DO
ब्लॉक करें
. PL/PgSQL और सादा SQL अलग-अलग भाषाएं हैं इसलिए आप सीधे PL/PgSQL कोड नहीं चला सकते।
अगर आपने क्यों के बारे में बताया तो इससे मदद मिलेगी आप अपने द्वारा चिपकाए गए कोड को लिखने का प्रयास कर रहे हैं। मुझे संदेह है कि आप एक ऐसी समस्या को हल करने का प्रयास कर रहे हैं जिसे ट्रिगर फ़ंक्शन के साथ बेहतर ढंग से संभाला जा सकता है। जैसे ऑडिट ट्रिगर ।
कुछ महत्वपूर्ण नोट:
आपको PostgreSQL को अपडेट करने की आवश्यकता है :PostgreSQL 8.2 खतरनाक रूप से पुराना है और असमर्थित . सुरक्षा और बग फिक्स अब जारी नहीं किए जा रहे हैं। समर्थित संस्करण में तत्काल अपग्रेड करें, लेकिन रिलीज़ नोटपढ़ना सुनिश्चित करें। ए> माइग्रेशन और संगतता सलाह के लिए प्रत्येक प्रमुख ".0" संस्करण जैसे "8.3.0", "8.4.0", आदि के लिए।
'अभी'
से बचें :साथ ही, 'now'
. का उपयोग करने के बजाय आपको आमतौर पर वर्तमान दिनांक/समय का उपयोग करना चाहिए कार्य
, विशेष रूप से current_timestamp
.
current_timestamp
स्थिर है :आप जो घेरा-कूद कर रहे हैं वह शायद अनावश्यक है क्योंकि current_timestamp
का मान (और 'अब'::टाइमस्टैम्प
) लेन-देन की अवधि के लिए नहीं बदलता है। जैसे:
regress=# BEGIN;
regress=# SELECT current_timestamp;
2012-08-14 14:52:43.382596+08
regress=# SELECT pg_sleep(5);
regress=# SELECT current_timestamp;
2012-08-14 14:52:43.382596+08
विवरण
आपका इरादा कुछ इस तरह प्रतीत होता है (गलत, उपयोग न करें ) कोड:
CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
DECLARE
curtime char;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
RETURN curtime;
END;
$$ LANGUAGE 'plpgsql';
लेकिन आपने char
. का दुरुपयोग किया है डेटाटाइप, जिसके लिए लंबाई पैरामीटर की आवश्यकता होती है। यदि आपूर्ति नहीं की जाती है तो यह डिफ़ॉल्ट रूप से 1 हो जाता है, इसलिए आपको यह मिलेगा:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
कभी नहीं चार
का उपयोग करें एसक्यूएल में डेटाटाइप; varchar
का उपयोग करें या पाठ
. क्रॉस-डेटाबेस पोर्टेबिलिटी के लिए varchar(n)
जहां n
अधिकतम लंबाई की आवश्यकता है; यदि पोर्टेबिलिटी की आवश्यकता नहीं है तो text
. का उपयोग करें ।
अगर आप char
बदलते हैं करने के लिए पाठ
उपरोक्त में, आपका कोड चल सकता है, लेकिन इसका अभी भी कोई मतलब नहीं है। मुझे बहुत संदेह है कि आप वास्तव में लिखना चाहते हैं:
CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
BEGIN
INSERT INTO logtable VALUES (logtxt, current_timestamp);
RETURN current_timestamp;
END;
$$ LANGUAGE 'plpgsql';
... लेकिन आप वर्तमान दिनांक/समय कार्य ।
यहाँ तक कि बहुत ज्यादा है, सच में। मुझे लगता है कि आप एक ऐसी समस्या को हल करने की कोशिश कर रहे हैं जो ट्रिगर के लिए बेहतर है।