2011-02-02 4 views
23

私はPostgreSQLを初めて使用しています。誰でもこのクエリを修正してください。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で 'PRINT' のようなメッセージを印刷する方法は?
  2. 例外情報でエラーを発生させるにはどうすればよいですか?
+0

何あなたは言語で書いていますか? Cのマクロを直接SQL文と混在させているように見え、タグに "plpgsql"と言っています。 – araqnid

+1

私はpostgresを初めて使っています。あなたは私がpostgresの質問の中でこれを達成するように案内できますか? –

+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

1つのステートメントが失敗した場合、postgresは自動的にロールバックを発行しますか?明示的にロールバックする必要はありませんか? –

+2

はい。トランザクション中( 'begin'後、 'commit'または 'rollback'の前)にエラーが発生すると、 'begin'以降のすべてがロールバックされます。 – gr5

3

あなたはpsqlのスクリプトとしてこれを書くことができ、例えば、

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

とパラメータでエラーを上げる

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

ありがとうございます。 –