質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

10024閲覧

postgresql テーブルの存在確認してからSELECT

prr4e

総合スコア73

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2015/11/10 15:16

お手数ですが、ご教示願います。

■実装済み
insert or update時のtriggerをfunction内の処理で実行
・この処理は既に実装できている。

■やりたい事
・function内で別のテーブルを参照させてUPDATEするカラムを増やしたい

上記は既に
NEW.flg =: ( CASE WHEN EXISTS(SELECT test_id FROM test_table WHERE NEW.id = test_id ) THEN 1 ELSE 0 END);
と実装しているが、

test_tableが存在するときだけ発行するようにしたいのですが、IF xxxxx で pg_classのrelnameを取得する方法しかないでしょうか。

なにかいいやり方があれば教えてください。

また、pg_classをSELECTして、UPDATEとした場合と
pg_classを見ずUPDATEしたときのQueryのパフォーマンスもご教示頂けたらと思っております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

その関数が1回しか呼ばれないようなものであれば、
SELECTをBEGIN,ENDブロックに入れ、
EXCEPTIONでundefined_tableを拾って無視するという方法も無くはないです。
しかし、例外処理をするよりはpg_classを調べたほうがいいと思います。

また、何度も呼び出される関数であれば
呼び出し元の方で先にpg_classでテーブルを調べて
対象テーブルが無ければ関数の呼び出し自体を行わないようにすれば
関数内で毎回pg_classをチェックするより早くなります。

パフォーマンスは、全体としてどのような処理をするかによります。
pg_classを1件検索する時間も、例外処理の時間も
1回だけなら問題にはならないと思います。

参考までに、例外処理にする場合は以下のようにします。

sql

1do $$ 2declare 3 x int; 4 r record; 5begin 6 begin 7 select * into r from HOGE; -- HOGEは存在しないテーブル 8 exception 9 when undefined_table then 10 raise notice 'UNDEF: %', SQLERRM; -- 例外でここにくる。メッセージを出すだけ 11 when others then 12 raise notice 'other %', SQLERRM; -- その他のエラーハンドリング 13 end; 14end; 15$$ 16language plpgsql;

投稿2016/09/30 07:25

KenRai

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prr4e

2016/10/17 10:20

返答が遅くなってすみません。 無事解決に至りました。 ありがとうございました。
guest

0

システムカタログを使うと良いようです。
http://chopl.in/blog/2013/11/07/how_to_retrieve_tables_and_columns_with_postgres.html

pg_classを参照する分アクセスが増えますから多少なりともパフォーマンスが落ちます。

投稿2015/11/10 19:25

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prr4e

2016/10/17 10:20

返答が遅くなってすみません。 無事解決に至りました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問