2011-02-02 16 views
23

मैं PostgreSQL के लिए नया हूं। क्या कोई इस प्रश्न को सही कर सकता है।पोस्टग्रेएसक्यूएल अपवाद हैंडलिंग

BEGIN TRANSACTION; 

BEGIN; 
    CREATE TABLE "Logs"."Events" 
    (
     EventId BIGSERIAL NOT NULL PRIMARY KEY, 
     PrimaryKeyId bigint NOT NULL, 
     EventDateTime date NOT NULL DEFAULT(now()), 
     Action varchar(12) NOT NULL, 
     UserId integer NOT NULL REFERENCES "Office"."Users"(UserId), 
     PrincipalUserId varchar(50) NOT NULL DEFAULT(user) 
    ); 

    CREATE TABLE "Logs"."EventDetails" 
    (
     EventDetailId BIGSERIAL NOT NULL PRIMARY KEY, 
     EventId bigint NOT NULL REFERENCES "Logs"."Events"(EventId), 
     Resource varchar(64) NOT NULL, 
     OldVal varchar(4000) NOT NULL, 
     NewVal varchar(4000) NOT NULL 
    ); 


    COMMIT TRANSACTION; 
    RAISE NOTICE 'Task completed sucessfully.' 
EXCEPTION; 
    ROLLBACK TRANSACTION; 
    RAISE ERROR @ErrorMessage, @LineNumber, @ErrorState --how to catch errors and display them???? 
END; 

सवाल:

  1. कैसे T-SQL में 'प्रिंट' की तरह एक संदेश मुद्रित करने के लिए?
  2. अपवाद जानकारी के साथ त्रुटियों को कैसे बढ़ाया जाए?
+0

क्या क्या आप भाषा में लिख रहे हैं? आप सीधे सीक्यूएल कथन के साथ सी मैक्रोज़ मिश्रण कर रहे हैं, और आप टैग में "plpgsql" कहते हैं। – araqnid

+1

मैं पोस्टग्रेज़ में नया हूं। क्या आप मुझे इस पोस्टग्रेस क्वेरी के अंदर प्राप्त करने में मार्गदर्शन कर सकते हैं। –

+1

धन्यवाद। संपादित। मैंने कुछ अन्य वाक्यविन्यासों की कोशिश की है लेकिन व्यर्थ के साथ। –

उत्तर

44

त्रुटि संदेश और उसके कोड को पकड़ने के लिए:

do $$ 


begin 


    create table yyy(a int); 
    create table yyy(a int); -- this will cause an error 



exception when others then 

    raise notice 'The transaction is in an uncommittable state. ' 
       'Transaction was rolled back'; 

    raise notice '% %', SQLERRM, SQLSTATE; 
end; 


$$ language 'plpgsql'; 

नहीं मिला है लाइन नंबर अभी तक

+0

यदि कोई कथन विफल हो जाता है तो पोस्टग्रेस स्वचालित रूप से रोलबैक जारी करेगा? क्या यह स्पष्ट रूप से इसे वापस रोल करने के लिए अनावश्यक है? –

+2

हां। यदि आप एक लेनदेन में हैं ('शुरूआत' के बाद लेकिन 'प्रतिबद्ध' या 'रोलबैक' से पहले) और एक त्रुटि होती है तो 'शुरुआत' के बाद से सब कुछ वापस लुढ़का जाता है। – gr5

3

आप

START TRANSACTION; 
CREATE TABLE ... 
CREATE TABLE ... 
COMMIT; 
\echo 'Task completed sucessfully.' 

एक psql स्क्रिप्ट, उदा के रूप में लिख सकता है, और

psql -f somefile.sql 

मानकों के साथ त्रुटियों की परवरिश के साथ चलाने के सीधे PostgreSQL में संभव नहीं है। इस तरह के कोड को पोर्ट करते समय, कुछ लोग त्रुटि स्ट्रिंग में आवश्यक जानकारी को एन्कोड करते हैं और यदि आवश्यक हो तो इसे बाहर निकाल दें।

यह सब थोड़ा अलग काम करता है, इसलिए कई चीजों को रिलीज़/पुनर्विचार/पुनर्लेखन के लिए तैयार रहें।

11

उपयोग DO statement, संस्करण 9.0 में एक नया विकल्प:

DO LANGUAGE plpgsql 
$$ 
BEGIN 
CREATE TABLE "Logs"."Events" 
    (
     EventId BIGSERIAL NOT NULL PRIMARY KEY, 
     PrimaryKeyId bigint NOT NULL, 
     EventDateTime date NOT NULL DEFAULT(now()), 
     Action varchar(12) NOT NULL, 
     UserId integer NOT NULL REFERENCES "Office"."Users"(UserId), 
     PrincipalUserId varchar(50) NOT NULL DEFAULT(user) 
    ); 

    CREATE TABLE "Logs"."EventDetails" 
    (
     EventDetailId BIGSERIAL NOT NULL PRIMARY KEY, 
     EventId bigint NOT NULL REFERENCES "Logs"."Events"(EventId), 
     Resource varchar(64) NOT NULL, 
     OldVal varchar(4000) NOT NULL, 
     NewVal varchar(4000) NOT NULL 
    ); 

    RAISE NOTICE 'Task completed sucessfully.';  
END; 
$$; 
+0

आपको बहुत मददगार धन्यवाद .. –

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