● 2_04_36_01-SQLの拡張 PL/pgSQL 条件式
前のページの続きとして読んで下さい。
「e_shouhin_t」商品テーブルに以下の内容の商品を入力するとします。
・Tシャツには3サイズ、2サイズ、フリー・サイズと3種類ある。3サイズは「S、M、L」、2サイズは「M、L」、フリー・サイズは「free」とします。
・e_shouhin_id、商品コードはSが0101-1なら、Mは0101-2、Lは0101-3と1ずつ増えます。
・e_shouhin_name、商品名はサイズが違っても同じとします。
・色は同一とします、色違いの商品は無しとします。
・価格はサイズ違いでも同一価格とします。
以上の入力に対してできるだけ労力を省いた関数を作成します。下記の仕様とします。
・ある命令によってその商品が3サイズ、2サイズ、フリーサイズかを判定する。ここが今回の条件式にあたるところです。
・商品コードを制御して1ずつ増える仕組みを作る。
以前使ったコードは以下です。これをカスタマイズして先の要件を満足したものを作ります。
関数名はe_shouhin_t_input_sizeとします。
drop function e_shouhin_t_input(varchar , varchar , varchar , varchar , int ,
varchar , timestamp ); -- 関数を削除するコマンド
-- drop function 関数名( 引数 )が構文です、引数はデータ型となります。
-------------------------------------------ここからが関数の作成文です。
create function e_shouhin_t_input(varchar , varchar , varchar , varchar , int
, varchar , timestamp) --
create function 関数名 ( 引数 )で作成します。
returns varchar as ' -- 必ず戻り値が必要です。ここの記載は必ず必要です。引数にあるデータ型なら、なんでもけっこうです。
declare -- 変数の宣言
-- 引数にそれぞれ変数を割り当てて、別名を設定します。
COAD_1 alias for $1; -- 1番目の引数$1をCOAD_1という別名を付ける
COAD_2 alias for $2; -- 2番目の引数$1をCOAD_2という別名を付ける
COAD_3 alias for $3; -- 3番目の引数$1をCOAD_3という別名を付ける
COAD_4 alias for $4; -- 4番目の引数$1をCOAD_4という別名を付ける
COAD_5 alias for $5; -- 5番目の引数$1をCOAD_5という別名を付ける
COAD_6 alias for $6; -- 6番目の引数$1をCOAD_6という別名を付ける
COAD_7 alias for $7; -- 7番目の引数$1をCOAD_7という別名を付ける
begin -- 処理文の始めを宣言
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color , e_shouhin_size
, e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD_1 , COAD_2 , COAD_3 , COAD_4 , COAD_5 , COAD_6 , COAD_7 );
return COAD_2; -- COAD_2を戻り値として返す
end; -- 処理文の終了を宣言
' language 'plpgsql'; -- 使用している言語を宣言 -------------------------------------------
select e_shouhin_t_input('0200' , 'a33' , 're' , 'LL' , '10000' , 'sh' , '2006-10-11
10:12:00' ); -- この文によって関数を実行します。 |
・サイズ判定の引数を「size」とします。「size」が「S、M、L」なら「3」、「M、L」なら2、「フリーサイズ」なら1とます。
必要な情報は商品コード「e_shouhin_id」、商品名「e_shouhin_name」、色「e_shouhin_color」、価格「e_shouhin_kakaku」です、日時は関数で取得します。
カスタマイズ後のコードです。
drop function e_shouhin_t_input_size( int , varchar , varchar , varchar , int );
-------------------------------------------
-- function e_shouhin_t_input_size( サイズの判定 , 商品コード , 商品名
, 色 , 価格 ) 必要な引数です。
create function e_shouhin_t_input_size( int , varchar , varchar , varchar ,
int )
returns varchar as '
declare
SIZE alias for $1; -- 1番目の引数$1をSIZEという別名を付ける
COAD alias for $2; -- 2番目の引数$1をCOADという別名を付ける
NAME alias for $3; -- 3番目の引数$1をNAMEという別名を付ける
COLOR alias for $4; -- 4番目の引数$1をCOLORという別名を付ける
KAKAKU alias for $5; -- 5番目の引数$1をKAKAKUという別名を付ける
L varchar := ''L''; -- 変数Lを可変長文字列で宣言して「L」を代入しています。以下同様な処理。代入の演算子に注意、シングルクォートは二重です。
M varchar := ''M'';
S varchar := ''S'';
F varchar := ''free'';
begin
if SIZE = 3 then -- もし変数SIZEが3の時は・・・という意味になります。
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color
, e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -1 , NAME , COLOR , S , KAKAKU , ''ts''
, CURRENT_TIMESTAMP ); -- 「||」は文字列結合の演算子です。
-- 「CURRENT_TIMESTAMP」は現在の年日時を取ります。
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color
, e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -2 , NAME , COLOR ,M , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color
, e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -3 , NAME , COLOR , L , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
else if SIZE = 2 then --
前文の条件が実行されない場合で、SIZEが2の時は・・・
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color
, e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -1 , NAME , COLOR ,M , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color
, e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -2 , NAME , COLOR , L , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
else if SIZE = 1 then -- 前文の条件が実行されない場合で、SIZEが1の時は・・・
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color
, e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD , NAME , COLOR , F, KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
-- 「end if」は条件式の個数分を書きます。
end if;
end if;
end if;
return COAD;
end;
' language 'plpgsql';
-------------------------------------------
-- function e_shouhin_t_input_size( サイズの判定 , 商品コード ,
商品名 , 色 , 価格 ) 必要な引数です。
select e_shouhin_t_input_size( '3' , '1001' , 'c20 ' , 'bl ' , '1000' ); --
この文によって関数を実行します。
select e_shouhin_t_input_size( '2' , '1002' , 'c20 ' , 'bl ' , '1000' );
-- この文によって関数を実行します。
select e_shouhin_t_input_size( '1' , '1003' , 'c20 ' , 'bl ' , '1000' ); --
この文によって関数を実行します。 |
上のコードは見易くするため全角スペースが入っているので下記を使って下さい。
drop function e_shouhin_t_input_size( int ,
varchar , varchar , varchar , int );
-------------------------------------------
-- function e_shouhin_t_input_size( サイズの判定 , 商品コード , 商品名 , 色 , 価格 ) 必要な引数です。
create function e_shouhin_t_input_size( int , varchar , varchar , varchar ,
int )
returns varchar as '
declare
SIZE alias for $1; -- 1番目の引数$1をSIZEという別名を付ける
COAD alias for $2; -- 2番目の引数$1をCOADという別名を付ける
NAME alias for $3; -- 3番目の引数$1をNAMEという別名を付ける
COLOR alias for $4; -- 4番目の引数$1をCOLORという別名を付ける
KAKAKU alias for $5; -- 5番目の引数$1をKAKAKUという別名を付ける
L varchar := ''L'';
M varchar := ''M'';
S varchar := ''S'';
F varchar := ''free'';
begin
if SIZE = 3 then
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color ,
e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -1 , NAME , COLOR , S , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color , e_shouhin_size
, e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -2 , NAME , COLOR ,M , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color ,
e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -3 , NAME , COLOR , L , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
else if SIZE = 2 then
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color ,
e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -1 , NAME , COLOR ,M , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color ,
e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD || -2 , NAME , COLOR , L , KAKAKU , ''ts'' , CURRENT_TIMESTAMP );
else if SIZE = 1 then
insert into e_shouhin_t( e_shouhin_id , e_shouhin_name , e_shouhin_color ,
e_shouhin_size , e_shouhin_kakaku , e_shouhin_group , e_shouhin_date )
values( COAD , NAME , COLOR , F, KAKAKU , ''ts'' , CURRENT_TIMESTAMP );
end if;
end if;
end if;
return COAD; -- COAD_2を戻り値として返す
end; -- 処理文の終了を宣言
' language 'plpgsql'; -- 使用している言語を宣言
-------------------------------------------
-- function e_shouhin_t_input_size( サイズの判定 , 商品コード , 商品名 , 色 , 価格 ) 必要な引数です。
select e_shouhin_t_input_size( '3' , '1001' , 'c20 ' , 'bl ' , '1000' ); --
この文によって関数を実行します。
select e_shouhin_t_input_size( '2' , '1002' , 'c20 ' , 'bl ' , '1000' ); --
この文によって関数を実行します。
select e_shouhin_t_input_size( '1' , '1003' , 'c20 ' , 'bl ' , '1000' ); --
この文によって関数を実行します。 |
実行できたら下記を実行して下さい。
select e_shouhin_t_input_size( '3' , '1001'
, 'c20 ' , 'bl ' , '1000' ); -- この文によって関数を実行します。
|
処理が成功したので商品コードを返しました。

商品情報を全検索します。3サイズがセットで入力されています。日時情報は前のものより関数を使ったため精度が高くなっています。

次は下記のSQLを実行します。成功すれば商品コード「1002」が返ってきます。
select e_shouhin_t_input_size( '2' , '1002'
, 'c20 ' , 'bl ' , '1000' ); -- この文によって関数を実行します。 |
商品を再度全検索します。2サイズがセットで入力されています。

次は下記のSQLを実行します。成功すれば商品コード「1003」が返ってきます。
select e_shouhin_t_input_size( '1' , '1003'
, 'c20 ' , 'bl ' , '1000' ); -- この文によって関数を実行します。 |
指定された条件で入力されています。

PHPの文法とはかなり違いがありますので注意して下さい。
戻る
|