● 2_04_36_02-SQLの拡張 PL/pgSQL ループ処理
前回の処理でinsert文を何回も書いているのをループに置き換えます。前のコードは以下になります。各条件式の中で3回、2回と繰り返されているinsert文をroopで1つにします。
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' ); --
この文によって関数を実行します。 |
関数名は e_shouhin_t_input_size_roop としています。ループ文のところを注目して下さい。
drop function e_shouhin_t_input_size_roop( int
, varchar , varchar , varchar , int );
-------------------------------------------
-- function e_shouhin_t_input_size_roop( サイズの判定 , 商品コード
, 商品名 , 色 , 価格 ) 必要な引数です。
create function e_shouhin_t_input_size_roop( 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''; -- 変数Mを可変長文字列で宣言し「M」を代入する
S varchar := ''S''; -- 変数Sを可変長文字列で宣言し「S」を代入する
F varchar := ''free''; -- 変数Fを可変長文字列で宣言し「free」を代入する
COUNT int ; -- 変数COUNTを数値型で宣言する
SIZE_DATA varchar ; -- 変数SIZE_DATAを数値型で宣言する
begin
if SIZE = 3 then
COUNT := 3; -- 数値型変数COUNTに3を代入する
for i in 1..COUNT loop -- 3から1までをカウント、3回ループ、変数iにカウントが格納されます。
if i = 1 then -- カウントが1であればサイズの変数に「S」を代入します
SIZE_DATA := ''S'';
else if i = 2 then -- カウントが2であればサイズの変数に「M」を代入します
SIZE_DATA := ''M'';
else if i = 3 then -- カウントが3であればサイズの変数に「L」を代入します
SIZE_DATA := ''L'';
end if;
end if;
end if;
-- 以上の条件に対して以下のinsert文が実行されます。コードの「-1」、「-2」、「-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 || -i ,
NAME , COLOR , SIZE_DATA , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
end loop;
else if SIZE = 2 then
COUNT := 2; -- 数値型変数COUNTに3を代入する
for i in 1..COUNT loop
if i = 1 then
SIZE_DATA := ''M'';
else if i = 2 then
SIZE_DATA := ''L'';
end if;
end if;
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 || -i , NAME , COLOR ,SIZE_DATA , KAKAKU , ''ts'' ,
CURRENT_TIMESTAMP );
end loop;
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_roop( '3' , '1010' , 'c20 ' , 'bl ' , '1000'
); -- この文によって関数を実行します。
select e_shouhin_t_input_size_roop( '2' , '1011' , 'c20 ' , 'bl ' , '1000'
); -- この文によって関数を実行します。
select e_shouhin_t_input_size_roop( '1' , '1012' , 'c20 ' , 'bl ' , '1000'
); -- この文によって関数を実行します。 |
上のコードは見易くするため全角スペースが入っているので下記を使って下さい。
drop function e_shouhin_t_input_size_roop( int
, varchar , varchar , varchar , int );
-------------------------------------------
-- function e_shouhin_t_input_size_roop( サイズの判定 , 商品コード , 商品名 , 色 , 価格 ) 必要な引数です。
create function e_shouhin_t_input_size_roop( 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''; -- 変数Mを可変長文字列で宣言し「M」を代入する
S varchar := ''S''; -- 変数Sを可変長文字列で宣言し「S」を代入する
F varchar := ''free''; -- 変数Fを可変長文字列で宣言し「free」を代入する
COUNT int ; -- 変数COUNTを数値型で宣言する
SIZE_DATA varchar ; -- 変数SIZE_DATAを数値型で宣言する
begin
if SIZE = 3 then
COUNT := 3; -- 数値型変数COUNTに3を代入する
for i in 1..COUNT loop
if i = 1 then
SIZE_DATA := ''S'';
else if i = 2 then
SIZE_DATA := ''M'';
else if i = 3 then
SIZE_DATA := ''L'';
end if;
end if;
end if;
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 || -i , NAME , COLOR , SIZE_DATA , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
end loop;
else if SIZE = 2 then
COUNT := 2; -- 数値型変数COUNTに3を代入する
for i in 1..COUNT loop
if i = 1 then
SIZE_DATA := ''M'';
else if i = 2 then
SIZE_DATA := ''L'';
end if;
end if;
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 || -i , NAME , COLOR ,SIZE_DATA , KAKAKU , ''ts'' , CURRENT_TIMESTAMP
);
end loop;
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_roop( '3' , '1010' , 'c20 ' , 'bl ' , '1000'
); -- この文によって関数を実行します。
select e_shouhin_t_input_size_roop( '2' , '1011' , 'c20 ' , 'bl ' , '1000'
); -- この文によって関数を実行します。
select e_shouhin_t_input_size_roop( '1' , '1012' , 'c20 ' , 'bl ' , '1000'
); -- この文によって関数を実行します。 |
実行できたら下記を実行して下さい。
select e_shouhin_t_input_size( '3' , '1010'
, 'c20 ' , 'bl ' , '1000' ); -- この文によって関数を実行します。 |
処理が成功したので商品コードを返しました。

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

select e_shouhin_t_input_size_roop( '2' , '1011'
, 'c20 ' , 'bl ' , '1000' ); -- この文によって関数を実行します。 |
処理が成功したので商品コードを返しました。

商品を再度全検索します。2サイズがセットで入力されています。

select e_shouhin_t_input_size_roop( '1' , '1012'
, 'c20 ' , 'bl ' , '1000' ); -- この文によって関数を実行します。 |
処理が成功したので商品コードを返しました。

指定された条件で入力されています。

非常に簡単なコードでしたが、基礎をする分では十分かなと思います。
正規マニュアルでは以下のところが解説になります。
第
37章PL/pgSQL - SQL手続き言語
戻る
|