2017-03-25 4 views
1

誰かが書いたこの結果を与える理由機能以下:機能を理解しようと、それは(彼は会社左)

Create function code_status 
(p_code_id varchar, 
    p_daytime date, 
    p_status varchar); 

    Select status into l_value from table1 where code_id=p_code_id and daytime=p_daytime; 

    Return l_value; 
    End; 

、以下のSQLクエリでそれを使用する:

Select code, daytime, status, code_status(code_id, daytime, status) from table2 
where code_status(code_id, daytime, status) in ('act') and daytime = '12 Jan 2017' 

は私がから選択クエリを実行します

:それは次のような結果を与えるコード= 'F23'

Select code, code_id, daytime, status from table1 where code = 'f23'; 

のためのすべての行を取得する機能私は実行すると

Code code_id status daytime 
F23 123df  act  16 Jul 2016 
F23 123df  stn  12 Jan 2017 
F23 123df  act  15 Mar 2017 

は、それ以下のクエリは、次の結果が得られます。今

Select code, daytime, code_id,status, code_status(code_id, daytime, status) stat_funct 
from table2 
where code_status(code_id, daytime, status) in ('act') 
    and daytime = '12 Jan 2017' 
    and code='f23' 
Code daytime  code_id status stat_funct 
F23 12 Jan 2017 123df  act  act 

私は、この関数が何をするのか理解しようと、それは、クエリでどのように機能するか、「なぜstat_functですよ行為'?

+0

異なるコードに対して複数の同じcode_idはありません。コードは1つのcode_idにのみ割り当てられます。 –

+1

"とdaytime = '12 Jan Jan ''"のためにできますか? –

+1

おそらくほとんどの場合、あなたはそれを呼び出す方法はほとんど効率が悪いでしょう - 基本的にはクエリのtable1とtable2を結合していますが、間接的にはその関数を介して結合しています。 'p_status'値は使用されません。両方のテーブルにデータが重複している可能性がありますが、そのいずれかのサンプルから分かりにくいです。 'stat_funct'は' table1'のステータス値です。 'table2'には何がありますか? –

答えて

0

それは「code_status」を指定されたパラメータを使用して、それを命名table2statusフィールドへのアクセスを抽象化です。 table1とtable2が似たスキーマを持つという事実は偶然ですが、関数がjoin(これははるかに優れています)で置き換えられる可能性があります。

これを作成する理由は、単純なクエリ(結合を避けるため)やセキュリティ上の理由(データへのすべてのアクセスがSP経由であり、セキュリティへのアクセスを許可テーブルの代わりにSPs - IMHOのアンチパターン)。

関連する問題