PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL 8.2 . में ब्लॉक चलाने में सक्षम नहीं है

ऐसा लगता है कि आप एक 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';

... लेकिन आप वर्तमान दिनांक/समय कार्य

यहाँ तक कि बहुत ज्यादा है, सच में। मुझे लगता है कि आप एक ऐसी समस्या को हल करने की कोशिश कर रहे हैं जो ट्रिगर के लिए बेहतर है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL स्कीमा पर सीमाएं लेनदेन के अंदर बदलती हैं?

  2. PostgreSQL में, citext प्रदर्शन के बारे में अजीब मुद्दा?

  3. Mac पर Odoo इंस्टालेशन LESSC कमांड निष्पादित नहीं कर सका

  4. सीरियल का शुरुआती मान बदलें - Postgresql

  5. पोस्टग्रेज क्वेरी हार्डकोडेड तारीख के बजाय current_date::date के साथ बहुत धीमी है