助け合いフォーラム

OSS-DB

OSS-DB Silver(Ver2.0)
問題ID : 12286
問題を開く
次のSQL文について正しいものはどれか。(2つ選択) CREATE OR REPLACE FUNCTION sample_func(TEXT) RETURNS SETOF INTEGER AS $$ SELECT id FROM sample WHERE staff = $1 ORDER BY id LIMIT 2; $$ LANGUAGE SQL STRICT;

この問題はプレミアムコンテンツです。

上に戻る

oss-db silver 問題ID 12286について

公開日 2023/06/11

CREATE OR REPLACE FUNCTION sample_func(TEXT) RETURNS SETOF INTEGER AS $$
SELECT id FROM sample WHERE staff = $1 ORDER BY id LIMIT 2;
$$ LANGUAGE SQL STRICT;
関数の処理はPL/pgSQLで定義されている

このFUNCTION作成に対して、「パラメータの値が同じであれば、何回実行しても関数が返す値は変わらない」
という回答が正しくない理由がわかりません。解説では

「・パラメータの値が同じであれば、何回実行しても関数が返す値は変わらない
関数を実行するテーブルに対してデータ変更があると、返される値が変わる場合もあります。詳しくは実行例をご確認ください。」

とありますが、こんな前提があるのであればどんな問題も覆ると思うのですが。


y yami777

2023/06/11 22:55

追記 「どのタイミングで何回実行しても」とあるのであれば、納得しますが この作成時点で何回実行しても変わらないと思うのですが…

2023/06/12 19:42

関数が返す値は変わらない

ってことなので、CREATE OR REPLACE FUNCTION sample_func(TEXT) ... の文の実行についての話ではなく、作成された関数を実行( SELECT sample_func() )した際の話ではないでしょうか?
実行例を見てくださいってことですが、sample_func() のパラメータに同じ「佐藤」を渡して実行した時に、データの状態によっては返ってくる値って変わりますよね。WHERE句の条件が同じでもSELECT文実行時のテーブル状態が変われば異なる値になるのは当然かと。

逆に言えば、この関数は「いちいちSELECT文全体を入力しなくても、渡した引数をWHERE staff=にセットして実行してくれる」関数を作ったと言えるかなと。たとえば「日付」を渡したら指定した日付の売り上げを集計して返してくれる関数作ったとして、日付を「今日」にして実行したら開店直後と閉店間際では同じ日付を指定してるのに返ってくる値って変わりますよね。そういう意味じゃないですかね?


コメント

y yami777

2023/06/13 15:27

成程、別解ありがとうございます。 参考になりました。FUNCTIONに対して、という事ならおっしゃる通りですね…。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?