タグ付けされた質問 「plpgsql」

PL / pgSQLは、PostgreSQLデータベースシステムのデフォルトの手続き型言語です。PL / pgSQLに関する質問は、おそらく「PostgreSQL」にもタグ付けする必要があります。

3
2つのプロセスが同時にマテリアライズドビューを同時にリフレッシュしようとするとどうなりますか?
ドキュメントによると: マテリアライズドビューの同時選択をロックアウトせずに、マテリアライズドビューを同時に更新します。(...) ...その他のコンテンツ... でも、このオプションを使用して一度に一つだけREFRESHは、任意のに対して実行可能 マテリアライズド・ビューは1。 私が持っていたそれをリフレッシュするマテリアライズド・ビューの最後のリフレッシュ時間を確認機能をして、60秒以上が経過した場合、それがでしょう。 しかし、2つの別々のプロセスから同時にマテリアライズドビューを更新しようとするとどうなりますか?彼らはキューに入れますか、それともエラーを上げますか? MATERIALIZED VIEWが更新されていることを検出して、触れないようにする方法はありますか? 現在、私は(設定リフレッシュする前に、テーブルのレコードを移入するために頼ってきたrefreshingしtrue)、その後にそれを設定するfalseプロセスが終了したとき。 EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id; EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view'; EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id; その後、このプロシージャを呼び出すたびに、最新の値last_updateとそのrefreshing値を確認します。refreshingtrueの場合、マテリアライズドビューを更新しようとしないでください。 EXECUTE 'SELECT extract(epoch FROM now() - (last_update))::integer, refreshing FROM refresh_status ORDER …

3
PL / pgSQLで複数行のレコードを返す方法
私はRECORDデータ型を使用して複数のレコードを返そうとしていますが、RECORDに追加し、このRECORDに反復するたびに新しい値を追加/追加する方法があります。 つまり、ループが終了すると行のセットになるrecように追加したいrecと思います。これは、関数の最後で単に返すことができます。現在、私はこれをやっています- SELECT temp_table.col1, temp_table.col2, temp_table.col3 INTO rec FROM temp_table WHERE temp_table.col3 = false; 私の完全なコードはここにあります: CREATE OR REPLACE FUNCTION validation() RETURNS RECORD AS $$ DECLARE rec RECORD; temp_row RECORD; BEGIN CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP; FOR temp_row IN SELECT * FROM staging.validation …

3
PostgreSQL手続き言語オーバーヘッド(plpython / plsql / pllua…)
リアルタイムタスクのパフォーマンス言語のパフォーマンスで PostgreSQLのユーザー定義関数に関する情報を見つけようとしています。 それらは組み込み関数とどのように比較されますか? Postgresがplpython関数とplpgsql関数とpllua関数をどのように呼び出し/管理するか(オーバーヘッドで)違いはありますか(VM自体ではなく、Postgres統合/コンテキスト/データ転送側に興味があります)? コンテキストは大きなオーバーヘッドですか?リアルタイムデータマッピングに使用できますか(1000クエリ/秒としましょう)) ユーザー定義関数をplpgsqlで作成して、他のpg / languageを作成する利点はありますか?上のドキュメント彼らは利点を列挙したが、私は、彼らはすべてのPostgreSQL手続き言語に適用されますと思います。 関連する調査結果: 非標準的な使用のためのPL言語の速度 PostgreSQL関数言語のパフォーマンス:CとPL / PGSQL

2
PL / pgSQLで手動で発生した例外の例外コンテキストを取得するにはどうすればよいですか?
Postgresでは、次のコードを使用して例外の「スタックトレース」を取得します。 EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; これは「自然な」例外では問題なく機能しますが、 RAISE EXCEPTION 'This is an error!'; ...その後、スタックトレースはありません。メーリングリストのエントリによると、これは意図的なものである可能性がありますが、私の人生では理由を理解することはできません。を使用する以外の例外をスローする別の方法を理解したいと思いRAISEます。私は明らかな何かを見逃しているだけですか?誰かがこれのためのトリックを持っていますか?私の選択した文字列を含むPostgresをスローできる例外はありますか?そのため、エラーメッセージで私の文字列だけでなく、完全なスタックトレースも取得しますか? ここに完全な例があります: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; BEGIN -- Comment this out to see how a "normal" exception will give you the stack trace RAISE …

1
エラー:セットを受け入れることができないコンテキストで呼び出されたset_valued関数。どんな内容ですか?
私はubuntu 12.04でPostgresql 9.1を使用しています。 私の質問へのクレイグの回答に触発されたsetofタイプまたはsetofレコードの連結私はreturn query、setof recordこのplpgsql関数に、、およびシリーズジェネレーターを使用するとうまくいくと思いました: create or replace function compute_all_pair_by_craig(id_obj bigint) returns setof record as $$ begin return query select o.id, generate_series(0,o.value) from m_obj as o; end; $$ language plpgsql; 実行中にエラーが発生します: ERROR: set_valued function called in context that cannot accept a set なにが問題ですか ?Craigとは逆に、関数に返すように指示しますsetof record。 私はCraigとまったく同じように機能する何かを実現できます。つまり、型create type pair_id_value as …

2
PL / pgSQL関数でレコードを返す-クエリを高速化する
私が持っているPerlで書かれた非フォークゲームデーモンのPostgreSQL 9.3データベースに書き込みプレーヤー統計にacyncクエリを使用しています、。しかし、データベースから何かを読み取る必要がある場合(プレーヤーが禁止されている場合や、プレーヤーにVIPステータスがある場合など)は、同期クエリを使用します。 これにより、データベースから値が読み取られるまで、ゲームが一瞬停止します。 値を読み取るために非同期クエリを使用するようにゲームデーモンを書き換えることはできません(試してみましたが、変更が多すぎました)。私の質問は、いくつかの無関係なクエリを組み合わせることは理にかなっています(新しいプレーヤーの場合に行う必要があることです)接続)を1つのプロシージャに追加し、Perlプログラムに同時にいくつかの値を返すにはどうすればよいですか? 現在のクエリはすべて、プレーヤーIDをパラメーターとして取り、1つの値を返します。 -- Has the player been banned? select true from pref_ban where id=? -- What is the reputation of this player? select count(nullif(nice, false)) - count(nullif(nice, true)) as rep from pref_rep where id=? -- Is he or she a special VIP player? select vip > now() …

2
測定単位を変換する
物質が異なる(ただし互換性のある)単位体積で与えられている物質のリストに最も適した測定単位を計算しようとしています。 単位換算表 単位変換テーブルには、さまざまな単位とそれらの単位の関係が格納されています。 id unit coefficient parent_id 36 "microlitre" 0.0000000010000000000000000 37 37 "millilitre" 0.0000010000000000000000000 5 5 "centilitre" 0.0000100000000000000000000 18 18 "decilitre" 0.0001000000000000000000000 34 34 "litre" 0.0010000000000000000000000 19 19 "dekalitre" 0.0100000000000000000000000 29 29 "hectolitre" 0.1000000000000000000000000 33 33 "kilolitre" 1.0000000000000000000000000 35 35 "megalitre" 1000.0000000000000000000000 0 係数でソートすると、parent_id子ユニットが上位の数値にリンクされていることがわかります。 このテーブルは、PostgreSQLで以下を使用して作成できます。 CREATE TABLE unit_conversion ( id …

3
PLPGSQLを使用して現在のsearch_pathにテーブルが存在するかどうかを確認するにはどうすればよいですか?
別のアプリケーションのアドオンであるアプリケーションのセットアップスクリプトを作成しているので、他のアプリケーションのテーブルが存在するかどうかを確認したいと思います。そうでない場合は、ユーザーに有用なエラーを提供します。ただし、テーブルを保持するスキーマがわかりません。 DO LANGUAGE plpgsql $$ BEGIN PERFORM 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = current_setting('search_path') AND c.relname = 'foo' AND c.relkind = 'r'; -- not sure if I actually need this or not... IF NOT FOUND THEN RAISE 'This application depends on tables …

2
PostgreSQL Upsertがパーティションテーブルで機能しない
次のようなテーブルがあります。 CREATE TABLE aggregated_master ( "user" BIGINT, type TEXT, date TIMESTAMP, operations BIGINT, amount NUMERIC, PRIMARY KEY ( "user", type, date ) ); このテーブルは、多くのパーティションが継承するマスターです。パーティションは、DATEフィールドのMONTHによって行われます。たとえば、Aug-2017のパーティションはagg_201708で、そのPKはpk_agg_201708になります。挿入を適切なパーティションにリダイレクトする通常のトリガーBEFORE INSERTがあります。 事は私がこのテーブルにUPSERTをしたいということです。DO CONFLICT部分が機能していません。 最初のコードはこのようなものでした INSERT INTO aggregated_master (user, type, date, oeprations, amount) SELECT user, type, date, SUM(ops), SUM(amt) FROM ... WHERE ... GROUP BY USER, TYPE, …

2
COMMITはPostgreSQL 9.5の匿名のplgpsql関数内で機能しますか?
匿名のplpgsqlコードブロック内のループを使用して、多数の大きなファイルをいくつかのテーブルにインポートしてパーティション分割します$do$。 $do$ BEGIN FOR yyyy in 2012..2016 THEN EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$; END LOOP; END; $do$ LANGUAGE plpgsql このプロセス全体には約15時間かかります。ある時点でインポートエラーが発生した場合、すべてのインポートがロールバックされないことを願っています。 IIRC COMMITは、関数全体が単一のトランザクションとして扱われるため、ストアド関数内では機能しません。 のドキュメントから$do$ コードブロックは、パラメーターのない関数の本体であるかのように扱われ、voidを返します。解析と実行は1回です。 これは、全体$do$が1つのトランザクションであるため、ブロック内のコミットが機能しないことを想定しています。私は正しいですか?

1
フィールド名のみが指定されたNEWまたはOLDフィールドにアクセスする方法は?
検証トリガーを書いています。トリガーは、配列の合計が別のフィールドと等しいことを検証する必要があります。この検証には多くのインスタンスがあるため、単一のプロシージャを記述して、チェックするフィールドのセットがそれぞれ異なる複数のトリガーを作成します。 たとえば、次のスキーマがあります。 CREATE TABLE daily_reports( start_on date , show_id uuid , primary key(start_on, show_id) -- _graph are hourly values, while _count is total for the report , impressions_count bigint not null , impressions_graph bigint[] not null -- interactions_count, interactions_graph -- twitter_interactions_count, twitter_interactions_graph ); 検証では、それを確認する必要がありますimpressions_count = sum(impressions_graph)。 NEWplpgsql内からフィールドに動的にアクセスする方法がわからないので、行き詰まっています。 CREATE FUNCTION validate_sum_of_array_equals_other() …

1
PL / pgSQLでテーブル型の変数を宣言する
クエリ結果を保持するためにPL / pgSQLで型tableの変数を宣言する方法があるかどうか疑問に思っていますか?たとえば、次のように表現するにはどうすればよいですか。 q1 = select * from foo; q2 = select * from bar; for t1 in q1: for t2 in q2: -- do something with t1 and t2 return next構文を調べましたが、それは戻り値しか処理できないようです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.