PL/SQL : リアルサンプル3

  SAMPLE03



CREATE or REPLACE PROCEDURE SAMPLE03
        (
         PM_BLOCKSHO    IN      NUMBER
        ,PM_DATE    IN      DATE
        )
        AS

/*===========================================================================
   変数
===========================================================================*/
    source_cursor        integer;
    destination_cursor    integer;
    delete_cursor        integer;
    rows_processed        integer;

    WK_DATE        DATE;
    WK_JIGYO1    NUMBER(2,0);
    WK_JIGYO2    NUMBER(2,0);
    WK_SELECT    VARCHAR2(1024);            -- select 文
    WK_INSERT    VARCHAR2(1024);            -- insert 文
    WK_DELETE    VARCHAR2(256);            -- delete 文

    事業部        NUMBER(2,0);
    部        NUMBER(1,0);
    課        NUMBER(1,0);
    取引先        NUMBER(5,0);
    取引先支店    NUMBER(2,0);
    受注        CHAR(8);

    SUM_INIT    BOOLEAN;
    SV事業部    NUMBER(2,0);
    SV部        NUMBER(1,0);
    SV課        NUMBER(1,0);
    SV取引先    NUMBER(5,0);
    SV取引先支店    NUMBER(2,0);
    SV受注        CHAR(8);

    工事名称    VARCHAR2(48);            -- 現場台帳より
    契約金額    NUMBER(10,0);            -- 現場台帳より

    単前回請求額    NUMBER(10,0);
    単入金金額    NUMBER(10,0);
    単今回請求額    NUMBER(10,0);
    請求日        DATE;

    前回請求額    NUMBER(10,0);
    入金金額    NUMBER(10,0);
    今回請求額    NUMBER(10,0);

    当月売上高    NUMBER(10,0);            -- 売上明細より
    消費税        NUMBER(10,0);            -- 売上明細より
    前受金額    NUMBER(10,0);            -- 中間請求より

/*=====================================================
   中間請求管理テーブル名取得
   IN   PM_DATE         : 締年月日
   OUT  PM_TBLNAME      : 目的テーブル名
=====================================================*/
FUNCTION GET_CHUKANK_NAME
        (
         PM_DATE        IN      DATE
        )
    RETURN VARCHAR2
        AS

        WK_DAY          VARCHAR2(30);
        WK_TBLNAME      VARCHAR2(30);
BEGIN
        WK_DAY := TO_CHAR( PM_DATE, 'DD' );
        WK_TBLNAME := 'KF_CYUKANK' || WK_DAY;
    RETURN WK_TBLNAME;
END GET_CHUKANK_NAME;

/*=====================================================
   長い文字列出力
=====================================================*/
PROCEDURE PUT_LSTR
        (
         PM_STR        IN      VARCHAR2
        )
        AS

BEGIN
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,1,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,81,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,161,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,241,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,321,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,401,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,481,80));
END PUT_LSTR;

/*=====================================================
   文字列出力
=====================================================*/
PROCEDURE PUT_STR
        (
         PM_STR        IN      VARCHAR2
        )
        AS

BEGIN
    DBMS_OUTPUT.PUT_LINE(PM_STR);
END PUT_STR;

/*=====================================================
   事業部コード取得
   IN   PM_BLOCKSHO     : ブロック小コード
   OUT  PM_JIGYO1       : 対応する事業部コード1
                          (NULLでエラー)        
   OUT  PM_JIGYO2       : 対応する事業部コード2
                          (該当無しでNULL)      
=====================================================*/
PROCEDURE GET_JCODE
        (
         PM_BLOCKSHO    IN      NUMBER
        ,PM_JIGYO1      IN OUT  NUMBER
        ,PM_JIGYO2      IN OUT  NUMBER
        )
        AS

        WK_JIGYO       NUMBER(2,0);

        CURSOR jigyo_cur is 
                select
                        CD_JIGYO
                from
                        MM_JIGYO
                where
                        CD_BLOCKSHO = PM_BLOCKSHO;

BEGIN

        PM_JIGYO1       := NULL;             
        PM_JIGYO2       := NULL;             
        WK_JIGYO        := NULL;
        OPEN    jigyo_cur;
        LOOP
                FETCH   jigyo_cur       INTO    WK_JIGYO;
                EXIT    WHEN    jigyo_cur%NOTFOUND;
                EXIT    WHEN    PM_JIGYO1 != WK_JIGYO;
                PM_JIGYO1       :=      WK_JIGYO;
        END LOOP;
        CLOSE   jigyo_cur;
        if WK_JIGYO is not NULL and PM_JIGYO1 != WK_JIGYO THEN
                PM_JIGYO2 := WK_JIGYO;
        end if;

EXCEPTION
        WHEN OTHERS THEN
                NULL;

END GET_JCODE;

/*=====================================================
 対象取引先チェック
=====================================================*/
FUNCTION CHECK_TORI
        (
         PM_TORI    IN    NUMBER
        ,PM_TORI_ST    IN    NUMBER
    ,PM_SDATE    IN    DATE
        )
    RETURN BOOLEAN
        AS

    WK_DAY        NUMBER(2,0);
    WK_CMP_DAY    NUMBER(2,0);
    WK_KBN_JITA    NUMBER(1,0);
    WK_SIME        DATE;
    WK_SIME_NEW    DATE;            -- 最新請求締年月日
    WK_SIME_NEW2    DATE;            -- 最新請求締年月日
    WK_RET        BOOLEAN;
    WK_TORISUB    BOOLEAN;
    WK_J        NUMBER(2,0);

BEGIN

        BEGIN                            -- 1)取引マスタ参照
        select
            KBN_JITA
        into
            WK_KBN_JITA
        from
            MM_TORI
        where
            CD_TORI        = PM_TORI and
            CD_TORI_ST    = PM_TORI_ST;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN NULL;
        END;
        if SQL%NOTFOUND or WK_KBN_JITA != 0 then  
dbms_output.put_line('取引マスタ無し or 自他区分が 0 で無い');
        return FALSE;
    end if;

        BEGIN                            -- 1)取引サブを参照
        select
            CD_JIGYO,
            DAY_SIME_SEI,
            YMD_SEI_NEW
        into
            WK_J,
            WK_DAY,
            WK_SIME_NEW
        from
            MM_TORISUB
        where
            CD_TORI        = PM_TORI and
            CD_TORI_ST    = PM_TORI_ST;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN NULL;
        END;
        if SQL%FOUND then    -- 取引サブに存在した
        WK_SIME_NEW := nvl(WK_SIME_NEW,ADD_MONTHS(PM_DATE,-1));
        WK_TORISUB := TRUE;
        if    WK_JIGYO2 is NULL and
             WK_J = WK_JIGYO1
                or
            WK_JIGYO2 is not NULL and
            WK_J = WK_JIGYO1
                or
            WK_JIGYO2 is not NULL and
            WK_J = WK_JIGYO2        then
            WK_RET := TRUE;
        else
            WK_RET := FALSE;
        end if;

        if LAST_DAY(PM_DATE) = PM_DATE then
            WK_CMP_DAY := 99;
        else
            WK_CMP_DAY := TO_NUMBER(TO_CHAR(PM_DATE,'DD'));
        end if;

        if WK_DAY = WK_CMP_DAY and WK_RET then
                    BEGIN
                select
                    YMD_SIME_SEI
                into
                    WK_SIME
                from
                    KF_HSIME_SEI
                where
                    CD_BLOCKSHO    = PM_BLOCKSHO and
                    CD_TORI        = PM_TORI and
                    CD_TORI_ST    = PM_TORI_ST;
                    EXCEPTION
                            WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%NOTFOUND then    -- 該当するデータが締め日変更ファイルには無い
                if PM_SDATE is NULL then
                    return FALSE;
                else
                    WK_DATE := WK_SIME_NEW + 1;
                    if WK_DATE <= PM_SDATE and PM_SDATE <= PM_DATE then
                        return TRUE;
                    else
                        dbms_output.put_line('取引SUB,日付範囲外');
                        return FALSE;
                    end if;
                end if;
            else
                if WK_SIME = PM_DATE then    -- 抽出除外条件
                    dbms_output.put_line('抽出除外条件');
                    return FALSE;
                else
                    if PM_SDATE is NULL then
                        WK_RET := FALSE;
                    else
                        WK_DATE := WK_SIME_NEW + 1;
                        if WK_DATE <= PM_SDATE and PM_SDATE <= PM_DATE then
                            WK_RET := TRUE;
                        else
                            dbms_output.put_line('取引SUB,日付範囲外');
                            WK_RET := FALSE;
                        end if;
                    end if;
                end if;
            end if;
        else
            dbms_output.put_line('取引SUB,締め日不一致');
            WK_RET := FALSE;
        end if;
    else        -- 取引サブに存在しなかった
        dbms_output.put_line('取引SUBに無い');
        WK_TORISUB := FALSE;
        WK_RET := FALSE;
    end if;

        BEGIN
        select
            YMD_SEI_NEW,
            YMD_HSIME_SEI
        into
            WK_SIME_NEW2,
            WK_SIME
        from
            KF_HSIME_SEI
        where
            CD_BLOCKSHO    = PM_BLOCKSHO and
            CD_TORI        = PM_TORI and
            CD_TORI_ST    = PM_TORI_ST;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
    END;
    if SQL%FOUND then
        WK_SIME_NEW2 := nvl(WK_SIME_NEW2,ADD_MONTHS(PM_DATE,-1));
        if WK_SIME = PM_DATE then
            if PM_SDATE is NULL then
                return FALSE;
            else
                WK_DATE := WK_SIME_NEW2 + 1;
                if WK_DATE <= PM_SDATE and PM_SDATE <= PM_DATE then    -- 範囲内
                    return TRUE;
                else
                    return WK_RET;
                end if;
            end if;
        else
            return WK_RET;
        end if;
    else
        return WK_RET;
    end if;

END CHECK_TORI;

/*=====================================================
  売上金額・消費税取得
=====================================================*/
PROCEDURE GET_KIN
        (
         PM_JUCHU    IN CHAR
        ,PM_KIN1    IN OUT  NUMBER
        ,PM_KIN2    IN OUT  NUMBER
        )
        AS

BEGIN
    if WK_JIGYO2 is NULL then
        BEGIN
            select nvl(sum(KIN_URIAGE),0),nvl(sum(ZEI_URIAGE),0) 
                into PM_KIN1,PM_KIN2 from PF_DAICHO,UF_URIDT,UF_URIAGE
                where
                     PF_DAICHO.NO_JUCHU = UF_URIDT.NO_JUCHU and
                    UF_URIDT.NO_URIAGE = UF_URIAGE.NO_URIAGE and
                    UF_URIDT.NO_HAKKO = UF_URIAGE.NO_HAKKO and
                    UF_URIDT.KBN_DENPYO = UF_URIAGE.KBN_DENPYO and
                    PF_DAICHO.YMD_URI_KJ between WK_DATE and PM_DATE and
                    UF_URIAGE.CD_JIGYO = WK_JIGYO1 and
                     PF_DAICHO.NO_JUCHU = PM_JUCHU;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN NULL;
            END;
            if SQL%NOTFOUND then  
            PM_KIN1 := 0;
            PM_KIN2 := 0;
        end if;
    else
        BEGIN
            select nvl(sum(KIN_URIAGE),0),nvl(sum(ZEI_URIAGE),0) 
                    into PM_KIN1,PM_KIN2 from PF_DAICHO,UF_URIDT,UF_URIAGE
                where
                     PF_DAICHO.NO_JUCHU = UF_URIDT.NO_JUCHU and
                    UF_URIDT.NO_URIAGE = UF_URIAGE.NO_URIAGE and
                    UF_URIDT.NO_HAKKO = UF_URIAGE.NO_HAKKO and
                    UF_URIDT.KBN_DENPYO = UF_URIAGE.KBN_DENPYO and
                    PF_DAICHO.YMD_URI_KJ between WK_DATE and PM_DATE and
                    UF_URIAGE.CD_JIGYO in (WK_JIGYO1,WK_JIGYO2) and
                     PF_DAICHO.NO_JUCHU = PM_JUCHU;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN NULL;
            END;
            if SQL%NOTFOUND then  
            PM_KIN1 := 0;
            PM_KIN2 := 0;
        end if;
    end if;    

END GET_KIN;

/*=====================================================
  関数名
=====================================================*/
FUNCTION SUM_CHUKAN
    RETURN BOOLEAN
    AS
BEGIN
    if SUM_INIT then
        事業部        := SV事業部;
        部        := SV部;
        課        := SV課;
        取引先        := SV取引先;
        取引先支店    := SV取引先支店;
        受注        := SV受注;
        SUM_INIT    := FALSE;
        if CHECK_TORI(取引先,取引先支店,請求日) then
            前回請求額    := 単前回請求額;
            入金金額    := 単入金金額;
            今回請求額    := 単今回請求額;
        end if;
        RETURN FALSE;
    else
        if    事業部        = SV事業部    and
            部        = SV部        and
            課        = SV課        and
            取引先        = SV取引先    and
            取引先支店    = SV取引先支店    and
            受注        = SV受注            then
            if CHECK_TORI(取引先,取引先支店,請求日) then
                前回請求額    := 前回請求額    + 単前回請求額;
                入金金額    := 入金金額    + 単入金金額;
                今回請求額    := 今回請求額    + 単今回請求額;
            end if;
            RETURN FALSE;
        else
            RETURN TRUE;
        end if;
    end if;
END SUM_CHUKAN;

/*===========================================================================
   主処理
===========================================================================*/
BEGIN

/*=====================================================
   初期処理
=====================================================*/
    GET_JCODE( PM_BLOCKSHO, WK_JIGYO1, WK_JIGYO2 );
    SUM_INIT := TRUE;
    前回請求額    := 0;
    入金金額    := 0;
    今回請求額    := 0;
--    PUT_STR(TO_CHAR(WK_DATE,'YY/MM/DD') || '〜' || TO_CHAR(PM_DATE,'YY/MM/DD'));
--    PUT_STR(TO_CHAR(WK_JIGYO1) || ' and ' || TO_CHAR(WK_JIGYO2));

/*=====================================================
   SELECT文作成
=====================================================*/
    WK_SELECT    :=
    'select
        UF_JUCHU.CD_JIGYO,
        UF_JUCHU.CD_BUMON,
        UF_JUCHU.CD_KA,
        PF_CHUKAN.CD_TOKUI,
        PF_CHUKAN.CD_TOKUI_ST,
        PF_CHUKAN.NO_JUCHU,
        nvl(PF_CHUKAN.KIN_ZENSEI,0),
        nvl(PF_CHUKAN.KIN_NYUKIN,0),
        nvl(PF_CHUKAN.KIN_KONSEI,0),
        PF_CHUKAN.YMD_SEIKYU
    from
        PF_CHUKAN,UF_JUCHU
    where
        PF_CHUKAN.NO_JUCHU = UF_JUCHU.NO_JUCHU';

    if WK_JIGYO2 is NULL then
        if WK_JIGYO1 is not NULL then
            WK_SELECT := CONCAT( WK_SELECT, ' and UF_JUCHU.CD_JIGYO = :WK_JIGYO1 ' );
        end if;
    else
        WK_SELECT := CONCAT( WK_SELECT, ' and UF_JUCHU.CD_JIGYO IN (:WK_JIGYO1,:WK_JIGYO2) ' );
    end if;    
    WK_SELECT := CONCAT( WK_SELECT, ' and PF_CHUKAN.YMD_SEIKYU <= :PM_DATE ' );
    WK_SELECT := CONCAT( WK_SELECT, 
        ' order by CD_JIGYO,CD_BUMON,CD_KA,PF_CHUKAN.CD_TOKUI,PF_CHUKAN.CD_TOKUI_ST,PF_CHUKAN.NO_JUCHU ' );

--    PUT_LSTR(WK_SELECT);

/*=====================================================
   入力定義
=====================================================*/
    source_cursor        :=    dbms_sql.open_cursor;
    dbms_sql.parse( source_cursor, WK_SELECT, 2 );


    dbms_sql.define_column( source_cursor,    1,    SV事業部 );
    dbms_sql.define_column( source_cursor,    2,    SV部 );
    dbms_sql.define_column( source_cursor,    3,    SV課 );
    dbms_sql.define_column( source_cursor,    4,    SV取引先 );
    dbms_sql.define_column( source_cursor,    5,    SV取引先支店 );
    dbms_sql.define_column( source_cursor,    6,    SV受注, 8 );
    dbms_sql.define_column( source_cursor,    7,    単前回請求額 );
    dbms_sql.define_column( source_cursor,    8,    単入金金額 );
    dbms_sql.define_column( source_cursor,    9,    単今回請求額 );
    dbms_sql.define_column( source_cursor,    10,    請求日 );

    if WK_JIGYO2 is NULL then
        if WK_JIGYO1 is not NULL then
            dbms_sql.bind_variable( source_cursor, 'WK_JIGYO1', WK_JIGYO1);
        end if;
    else
        dbms_sql.bind_variable( source_cursor, 'WK_JIGYO1', WK_JIGYO1);
        dbms_sql.bind_variable( source_cursor, 'WK_JIGYO2', WK_JIGYO2);
    end if;    
    dbms_sql.bind_variable( source_cursor, 'PM_DATE', PM_DATE);

    rows_processed        :=    dbms_sql.execute( source_cursor );

/*=====================================================
   出力定義
=====================================================*/
    destination_cursor    :=    dbms_sql.open_cursor;
    WK_INSERT    :=
    'insert into ' || GET_CHUKANK_NAME(PM_DATE) || ' (
        CD_BLOCKSHO,
        CD_JIGYO,
        CD_BUMON,
        CD_KA,
        CD_TORI,
        CD_TORI_ST,
        NO_JUCHU,
        NM_KOJI,
        KIN_KEIYAKU,
        KIN_ZENSEI,
        KIN_NYUKIN,
        KIN_KONSEI,
        KIN_URIAGE,
        KIN_SYOUHI,
        KIN_MAEUKE
    ) values(
        :CD_BLOCKSHO,
        :CD_JIGYO,
        :CD_BUMON,
        :CD_KA,
        :CD_TORI,
        :CD_TORI_ST,
        :NO_JUCHU,
        :NM_KOJI,
        :KIN_KEIYAKU,
        :KIN_ZENSEI,
        :KIN_NYUKIN,
        :KIN_KONSEI,
        :KIN_URIAGE,
        :KIN_SYOUHI,
        :KIN_MAEUKE
    )';

--    PUT_LSTR(WK_INSERT);
    dbms_sql.parse( destination_cursor, WK_INSERT, 2 );

    delete_cursor    :=    dbms_sql.open_cursor;
    WK_DELETE    := 'delete from ' || GET_CHUKANK_NAME(PM_DATE);
    dbms_sql.parse( delete_cursor, WK_DELETE, 2 );
    rows_processed    :=    dbms_sql.execute( delete_cursor );
    dbms_sql.close_cursor( delete_cursor );

/*=====================================================
   入出力
=====================================================*/

    loop
        if dbms_sql.fetch_rows( source_cursor ) > 0 then

            dbms_sql.column_value( source_cursor,    1,    SV事業部 );
            dbms_sql.column_value( source_cursor,    2,    SV部 );
            dbms_sql.column_value( source_cursor,    3,    SV課 );
            dbms_sql.column_value( source_cursor,    4,    SV取引先 );
            dbms_sql.column_value( source_cursor,    5,    SV取引先支店 );
            dbms_sql.column_value( source_cursor,    6,    SV受注 );
            dbms_sql.column_value( source_cursor,    7,    単前回請求額 );
            dbms_sql.column_value( source_cursor,    8,    単入金金額 );
            dbms_sql.column_value( source_cursor,    9,    単今回請求額 );
            dbms_sql.column_value( source_cursor,    10,    請求日 );
dbms_output.put_line('READ');
dbms_output.put_line(単前回請求額);
dbms_output.put_line(単入金金額);
dbms_output.put_line(単今回請求額);

            if SUM_CHUKAN then
                dbms_sql.bind_variable( destination_cursor, 'CD_BLOCKSHO', PM_BLOCKSHO);
                dbms_sql.bind_variable( destination_cursor, 'CD_JIGYO', 事業部);
                dbms_sql.bind_variable( destination_cursor, 'CD_BUMON', 部);
                dbms_sql.bind_variable( destination_cursor, 'CD_KA', 課);
                dbms_sql.bind_variable( destination_cursor, 'CD_TORI', 取引先);
                dbms_sql.bind_variable( destination_cursor, 'CD_TORI_ST', 取引先支店);
                dbms_sql.bind_variable( destination_cursor, 'NO_JUCHU', 受注);

                    BEGIN
                    select NM_KOJI,KIN_KEIYAKU 
                        into 工事名称,契約金額 from PF_DAICHO where NO_JUCHU = 受注;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%NOTFOUND then  
                    工事名称 := NULL;
                    契約金額 := 0;
                end if;
                    BEGIN
                    select nvl(sum(KIN_NYUKIN),0) 
                        into 前受金額 from PF_CHUKAN,PF_DAICHO 
                        where 
                            PF_CHUKAN.NO_JUCHU = PF_DAICHO.NO_JUCHU and 
                            PF_CHUKAN.NO_JUCHU = 受注 and 
                            YMD_URI_KJ between WK_DATE and PM_DATE;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%NOTFOUND then  
                    前受金額 := 0;
                end if;

                dbms_sql.bind_variable( destination_cursor, 'NM_KOJI', 工事名称);
                dbms_sql.bind_variable( destination_cursor, 'KIN_KEIYAKU', 契約金額);
                dbms_sql.bind_variable( destination_cursor, 'KIN_ZENSEI', 前回請求額);
                dbms_sql.bind_variable( destination_cursor, 'KIN_NYUKIN', 入金金額);
                dbms_sql.bind_variable( destination_cursor, 'KIN_KONSEI', 今回請求額);

                GET_KIN(受注,当月売上高,消費税);
                dbms_sql.bind_variable( destination_cursor, 'KIN_URIAGE', 当月売上高);    -- 関数より
                dbms_sql.bind_variable( destination_cursor, 'KIN_SYOUHI', 消費税);    -- 関数より
                dbms_sql.bind_variable( destination_cursor, 'KIN_MAEUKE', 前受金額);
                rows_processed        :=    dbms_sql.execute(destination_cursor);

dbms_output.put_line('INSERT');
dbms_output.put_line(前回請求額);
dbms_output.put_line(入金金額);
dbms_output.put_line(今回請求額);
                前回請求額    := 0;
                入金金額    := 0;
                今回請求額    := 0;
                if CHECK_TORI(SV取引先,SV取引先支店,請求日) then
dbms_output.put_line('CHECKOK');
                    前回請求額    := 単前回請求額;
                    入金金額    := 単入金金額;
                    今回請求額    := 単今回請求額;
                end if;
                事業部        := SV事業部;
                部        := SV部;
                課        := SV課;
                取引先        := SV取引先;
                取引先支店    := SV取引先支店;
                受注        := SV受注;
            end if;
        else
            if SUM_INIT = FALSE then
                dbms_sql.bind_variable( destination_cursor, 'CD_BLOCKSHO', PM_BLOCKSHO);
                dbms_sql.bind_variable( destination_cursor, 'CD_JIGYO', 事業部);
                dbms_sql.bind_variable( destination_cursor, 'CD_BUMON', 部);
                dbms_sql.bind_variable( destination_cursor, 'CD_KA', 課);
                dbms_sql.bind_variable( destination_cursor, 'CD_TORI', 取引先);
                dbms_sql.bind_variable( destination_cursor, 'CD_TORI_ST', 取引先支店);
                dbms_sql.bind_variable( destination_cursor, 'NO_JUCHU', 受注);

                    BEGIN
                    select NM_KOJI,KIN_KEIYAKU into 工事名称,契約金額 
                        from PF_DAICHO where NO_JUCHU = 受注;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%NOTFOUND then  
                    工事名称 := NULL;
                    契約金額 := 0;
                end if;
                    BEGIN
                    select nvl(sum(KIN_NYUKIN),0) 
                        into 前受金額 from PF_CHUKAN,PF_DAICHO 
                        where 
                            PF_CHUKAN.NO_JUCHU = PF_DAICHO.NO_JUCHU and 
                            PF_CHUKAN.NO_JUCHU = 受注 and 
                            YMD_URI_KJ between WK_DATE and PM_DATE;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%NOTFOUND then  
                    前受金額 := 0;
                end if;

                dbms_sql.bind_variable( destination_cursor, 'NM_KOJI', 工事名称);
                dbms_sql.bind_variable( destination_cursor, 'KIN_KEIYAKU', 契約金額);
                dbms_sql.bind_variable( destination_cursor, 'KIN_ZENSEI', 前回請求額);
                dbms_sql.bind_variable( destination_cursor, 'KIN_NYUKIN', 入金金額);
                dbms_sql.bind_variable( destination_cursor, 'KIN_KONSEI', 今回請求額);

                GET_KIN(受注,当月売上高,消費税);
                dbms_sql.bind_variable( destination_cursor, 'KIN_URIAGE', 当月売上高);    -- 関数より
                dbms_sql.bind_variable( destination_cursor, 'KIN_SYOUHI', 消費税);    -- 関数より
                dbms_sql.bind_variable( destination_cursor, 'KIN_MAEUKE', 前受金額);
                rows_processed        :=    dbms_sql.execute(destination_cursor);
            end if;
            exit;
        end if;
    end loop;

/*=====================================================
   終了処理
=====================================================*/
    commit;
    dbms_sql.close_cursor( source_cursor );
    dbms_sql.close_cursor( destination_cursor );

END SAMPLE03;
/












  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ