2_04_36_02-SQLの拡張 PL/pgSQL ループ処理

PHPとPostgreSQLを利用したWEBシステムの開発例を掲載していきます。腕時計 販売サイト my-watch.biz



● 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手続き言語


戻る

Copyright (c) 2007 MSweb All Rights Reserved

腕時計 クロノグラフ(時計)のメンズ専門販売サイトカシオ G-SHOCK、Baby-G(腕時計)専門の通信販売サイトG-SHOCK、Baby-G専門通販サイト 運営ブログ

腕時計 女性専用 販売のladies-watch.biz腕時計 メンズ(男性)専門販売のmens-watch.biz