2011-02-02 42 views
23

PostgreSQL uygulamasında yeniyim. Herkes bu sorguyu düzeltebilir.PostgreSQL Özel Durum İşleme

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; 

Sorular:

  1. Nasıl T-SQL 'PRINT' gibi bir mesaj yazdırmak için?
  2. İstisna bilgileriyle hatalar nasıl yükseltilir?
+0

neyi dil mi yazıyorsun C makrolarını doğrudan SQL deyimleriyle karıştırıyorsunuz ve etiketlerde "plpgsql" diyorsunuz. – araqnid

+1

Ben postgres için yeniyim. Bana bu postgres sorgusunda ulaşmama yardımcı olabilir misiniz. –

+1

Teşekkürler. Düzenlenen. Birkaç sözdizimi denedim ama boşuna. –

cevap

44

hata mesajını ve kodunu yakalamak için:

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'; 

bulunamadı mı hat numarası henüz

+0

Bir ifade başarısız olursa, postgres otomatik olarak geri alma sorunu olur mu? Açıkça geri vermek gereksiz midir? –

+2

Evet. Eğer bir işlemdeyseniz ('başla' sonra 'taahhüt' veya 'geri alma') ve bir hata oluşursa, 'başlangıç' dan itibaren her şey geri alınır. – gr5

3

Sen, örneğin bir psql'in senaryo olarak

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

bunu yazmak ve

psql -f somefile.sql 

parametrelerle hataları Raising ile çalıştırabilir doğrudan PostgreSQL mümkün değildir. Bu tür bir kodu naklederken, bazı kişiler gerekli bilgiyi hata dizesinde kodlar ve gerekirse ayrıştırır.

Her şey biraz farklı çalışıyor, bu yüzden pek çok şeyi yeniden öğrenmeye/yeniden düşünmeye/yeniden yazmaya hazır olun.

11

Kullanım DO statement, sürüm 9.0 yeni bir seçenek:

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

çok teşekkür ederim .. –