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

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

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

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

Q&A

解決済

2回答

4136閲覧

withが有効な期間?について

hayash-dev

総合スコア50

PostgreSQL

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

0グッド

0クリップ

投稿2018/05/21 01:58

PostgreSQL9.5(Windows10 64bit環境)を使用しています。

PostgreSQLのwith句を使用したストアドプロシージャを作成し、実行しました。
内容は以下のようなものです。


CREATE TABLE public.point
(
_id serial,
_date date,
_value integer
)

_id_date_value
1'2018-05-01'1
2'2018-05-02'2
3'2018-05-03'3

SQL

1CREATE OR REPLACE FUNCTION public._sample_proc( 2 IN _target_date date 3) 4 RETURNS void AS 5$BODY$ 6DECLARE 7--変数宣言 8 _now_val integer; 9 _count integer; 10 _arr_id integer[]; 11BEGIN 12 13with 14x as ( 15select 16 point._id 17 ,point._date 18 ,SUM(point._value) over (order by _date) AS _sum_value 19 from point 20 where _value > 0 21 order by _date 22) 23 24 select count(*)+1 into _count from x where _sum_value < 2; 25 select array_agg(x._id) into _arr_id from x ; 26 27RETURN ; 28 29END; 30$BODY$ 31 LANGUAGE plpgsql VOLATILE 32 COST 100; 33ALTER FUNCTION public._sample_proc(date) 34 OWNER TO postgres;

上記を実行すると、

SQL

1select * from _sample_proc('2018-05-10'::date); 2 3ERROR: リレーション"x"は存在しません 4LINE 1: select array_agg(x._id) from x 5 ^ 6QUERY: select array_agg(x._id) from x 7CONTEXT: PL/pgSQL関数_sample_proc(date)21行目の型SQL ステートメント 8 9********** エラー ********** 10 11ERROR: リレーション"x"は存在しません 12SQLステート:42P01 13コンテキスト:PL/pgSQL関数_sample_proc(date)21行目の型SQL ステートメント

と出力されます。

withで定義したxを使用する2つのselectのうち、先に使用しているselectを無効にすると、
実行時のエラーは発生しません。

-- select count(*)+1 into _count from x where _sum_value < 2; select array_agg(x._id) into _arr_id from x ;

ストアドでwithを使用するのが不適切なのかもしれませんが、私のwithに対する認識は、
withで定義した問合せ結果を一時的に保持してくれるもの、
という認識です。動作的には、1つ目のselectで一時的な保存が無くなってしまうように見えるのですが
ストアドプロシージャ内で有効にし続ける方法はあるでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

withの有効範囲は ; までなので

select count(*)+1 into _count from x where _sum_value < 2;

が範囲です。

VIEWを使ってはいかがでしょうか?

投稿2018/05/21 02:08

Orlofsky

総合スコア16415

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

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

hayash-dev

2018/05/21 02:26

回答ありがとうございます。 > withの有効範囲は ; まで ポスグレを使って3年以上経つのに、こんな基本的な事を知らなかった事にショックです。 viewを使う件ですが、サンプルの為、簡単なテーブルや問合せを記載しました。 実際にはもう少し複雑な為、viewに置き換えるのは難しそうです。 質問としては、withが有効な期間が';'までと判明しましたので、ベストアンサーとさせてください。
guest

0

withの有効な範囲は';'までと判明したので解決とします。

投稿2018/05/21 02:27

hayash-dev

総合スコア50

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問