Oracle 函數返回表實例2種寫法實例

--注:用ps/sql工具執行語句
--一合同預算狀態函數
--1.
drop type htjs_business_row 
drop type htjs_business_state_row_type
CREATE OR REPLACE type htjs_business_state_row_type as object(bissid VARCHAR2(20),businessState varchar2(50));    
CREATE OR REPLACE type htjs_business_row as table of htjs_business_state_row_type; 
--2.
CREATE OR REPLACE 
function fun_htjs_business_state return htjs_business_row pipelined as    
v htjs_business_state_row_type;    
            businessState VARCHAR2(50);java

            bissid bosp_htys_businessreserve.id%type;
            isquit bosp_htys_businessreserve.isquit%type;
            BUS_STATE bosp_htys_businessreserve.BUS_STATE%type;
            formalcensor bosp_htys_receptioninfo.formalcensor%type;
            accept_state bosp_htys_receptioninfo.accept_state%type;
            substanceresult bosp_htys_backstageinfo.substanceresult%type;
            iscomplete bosp_htys_backstageinfo.iscomplete%type;
            gather_state bosp_htys_backstageinfo.gather_state%type;
            app_state bosp_htjs_contract_report.app_state%type;
            back_app_state bosp_htys_backstageinfo.app_state%type;
            mortem_state bosp_htys_ysinfo.mortem_state%type;
            returnman bosp_htys_businessreserve.returnman%type;
            issubmit bosp_htys_backstageinfo.issubmit%type;
begin    
        for myrow in (
                --狀態sql開始
                    SELECT
                        biss. ID,
                        biss.isquit,
                        biss.BUS_STATE,
                        rec.formalcensor,
                        rec.accept_state,
                        back.substanceresult,
                        back.iscomplete,
                        back.gather_state,
                        back.app_state back_app_state,
                        bhcreport.app_state,
                        ys.mortem_state,
                        biss.returnman,
                        back.issubmit
                    FROM
                        bosp_htys_businessreserve biss
                    LEFT JOIN bosp_htys_receptioninfo rec ON biss. ID = rec.business_id
                    LEFT JOIN bosp_htjs_contractinfo con ON con. ID = biss.contractinfo_id
                    LEFT JOIN bosp_htjs_subengineeringinfo sub ON sub. ID = con.subengineeringinfo_id
                    LEFT JOIN bosp_htjs_engineeringinfo eng ON eng. ID = sub.engineering_id
                    LEFT JOIN bosp_global_supplier sup ON con.supplier_id = sup. ID
                    LEFT JOIN bosp_htys_backstageinfo back ON back.qt_business_id = rec. ID
                    LEFT JOIN bosp_htys_budget budget ON budget.business_id = biss. ID
                    LEFT JOIN bosp_htys_monthlygatherinfo bhmgather ON bhmgather.business_id = biss. ID
                    LEFT JOIN bosp_htjs_contract_report bhcreport ON (
                        bhmgather.report_id = bhcreport. ID
                        AND bhcreport.report_type = 2
                        AND bhcreport.is_del = 0
                    )
                    LEFT JOIN bosp_htys_ysinfo ys ON ys.business_id = biss. ID
                    where biss.business_type IN (1,2,3,4,5,6)
                --狀態sql結束
            ) loop sql

            --業務邏輯判斷開始
            bissid := myrow.ID;                 
            isquit := myrow.isquit;
            BUS_STATE := myrow.BUS_STATE;
            formalcensor := myrow.formalcensor;
            accept_state := myrow.accept_state;
            substanceresult := myrow.substanceresult;
            iscomplete := myrow.iscomplete;
            gather_state := myrow.gather_state;
            app_state := myrow.app_state;
            back_app_state := myrow.back_app_state;
            mortem_state := myrow.mortem_state;
            returnman := myrow.returnman;
            issubmit := myrow.issubmit;
            dbms_output.put_line(BUS_STATE); app

            if BUS_STATE is not null THEN
                if BUS_STATE=0  then
                    businessState := 'dsl';
                elsif (BUS_STATE=1 or BUS_STATE=3) then
                    if formalcensor is null then
                        businessState := 'dxssc';
                    elsif formalcensor=0  then
                        businessState := 'xsscbtg';
                    elsif formalcensor=1  then
                        businessState := 'xssctg';
                        if accept_state=1  then
                            businessState := 'dszsc';
                            if mortem_state=4  then
                                businessState := 'ysth';
                            end if;
                            --實審開始
                            if substanceresult is not null then
                                    if issubmit is not null then
                                            if issubmit=1 then
                                                    if substanceresult=0  then
                                                            businessState := 'szscbtg';
                                                    elsif substanceresult=1  then
                                                            businessState := 'szsctg';
                                                            if isquit=1 then
                                                                    if back_app_state is not null then
                                                                            businessState := 'isquit_money_app_state' || back_app_state;
                                                                    end if;
                                                            else
                                                                    businessState := 'dbzys';
                                                                    if iscomplete=1 then
                                                                            businessState := 'ybzys';
                                                                            if gather_state=1  then
                                                                                    if app_state is not null then
                                                                                            businessState := 'declare_state' || app_state;
                                                                                    end if;
                                                                            end if;
                                                                    end if;
                                                            end if;
                                                    elsif substanceresult=2  then
                                                            businessState := 'qxzz';
                                                    end if; 
                                            end if;
                                    end if;
                            end if;
                            --實審結束
                        end if;
                    end if; 
                elsif BUS_STATE=2 then
                    businessState := 'thgys';
                    if formalcensor=0  then
                        businessState := 'xsscbtg';
                    end if;
                end if; 
            end if;
            
            
            --業務邏輯判斷結束
            v := htjs_business_state_row_type(bissid,businessState);    
            pipe row (v);    
        end loop;
return;    
end; xss


--二:測試函數結果集表
select htjs_business_state.* from table(fun_htjs_business_state) htjs_business_state;  函數

--三:建立對應物化視圖
drop materialized view mv_htjs_business_state;
create materialized view mv_htjs_business_state refresh force on demand as select htjs_business_state.* from table(fun_htjs_business_state) htjs_business_state;
--1.查詢語句:
select * from mv_htjs_business_state;工具

--四:調用前手動刷新物化視圖
--1.pl/sql命令刷新:exec dbms_mview.refresh('mv_htjs_business_state');
--2.java中調用:call dbms_mview.refresh('mv_htjs_business_state')";oop


--業務狀態寫法二:
create or replace function fun_htjs_business_state
return htjs_business_row
as
    rs htjs_business_row:= htjs_business_row();
    
    businessState VARCHAR2(50);測試

            bissid bosp_htys_businessreserve.id%type;
            isquit bosp_htys_businessreserve.isquit%type;
            BUS_STATE bosp_htys_businessreserve.BUS_STATE%type;
            formalcensor bosp_htys_receptioninfo.formalcensor%type;
            accept_state bosp_htys_receptioninfo.accept_state%type;
            substanceresult bosp_htys_backstageinfo.substanceresult%type;
            iscomplete bosp_htys_backstageinfo.iscomplete%type;
            gather_state bosp_htys_backstageinfo.gather_state%type;
            app_state bosp_htjs_contract_report.app_state%type;
            back_app_state bosp_htys_backstageinfo.app_state%type;
            mortem_state bosp_htys_ysinfo.mortem_state%type;
            returnman bosp_htys_businessreserve.returnman%type;
            issubmit bosp_htys_backstageinfo.issubmit%type;
begin
    for myrow in(
                --狀態sql開始
                    SELECT
                        biss. ID,
                        biss.isquit,
                        biss.BUS_STATE,
                        rec.formalcensor,
                        rec.accept_state,
                        back.substanceresult,
                        back.iscomplete,
                        back.gather_state,
                        back.app_state back_app_state,
                        bhcreport.app_state,
                        ys.mortem_state,
                        biss.returnman,
                        back.issubmit
                    FROM
                        bosp_htys_businessreserve biss
                    LEFT JOIN bosp_htys_receptioninfo rec ON biss. ID = rec.business_id
                    LEFT JOIN bosp_htjs_contractinfo con ON con. ID = biss.contractinfo_id
                    LEFT JOIN bosp_htjs_subengineeringinfo sub ON sub. ID = con.subengineeringinfo_id
                    LEFT JOIN bosp_htjs_engineeringinfo eng ON eng. ID = sub.engineering_id
                    LEFT JOIN bosp_global_supplier sup ON con.supplier_id = sup. ID
                    LEFT JOIN bosp_htys_backstageinfo back ON back.qt_business_id = rec. ID
                    LEFT JOIN bosp_htys_budget budget ON budget.business_id = biss. ID
                    LEFT JOIN bosp_htys_monthlygatherinfo bhmgather ON bhmgather.business_id = biss. ID
                    LEFT JOIN bosp_htjs_contract_report bhcreport ON (
                        bhmgather.report_id = bhcreport. ID
                        AND bhcreport.report_type = 2
                        AND bhcreport.is_del = 0
                    )
                    LEFT JOIN bosp_htys_ysinfo ys ON ys.business_id = biss. ID
                    where biss.business_type IN (1,2,3,4,5,6)
                --狀態sql結束
      ) 
      loop
        --業務邏輯判斷開始
            bissid := myrow.ID;                 
            isquit := myrow.isquit;
            BUS_STATE := myrow.BUS_STATE;
            formalcensor := myrow.formalcensor;
            accept_state := myrow.accept_state;
            substanceresult := myrow.substanceresult;
            iscomplete := myrow.iscomplete;
            gather_state := myrow.gather_state;
            app_state := myrow.app_state;
            back_app_state := myrow.back_app_state;
            mortem_state := myrow.mortem_state;
            returnman := myrow.returnman;
            issubmit := myrow.issubmit;
            dbms_output.put_line(BUS_STATE); 
            
            
            if BUS_STATE is not null THEN
                if BUS_STATE=0  then
                    businessState := 'dsl';
                elsif (BUS_STATE=1 or BUS_STATE=3) then
                    if formalcensor is null then
                        businessState := 'dxssc';
                    elsif formalcensor=0  then
                        businessState := 'xsscbtg';
                    elsif formalcensor=1  then
                        businessState := 'xssctg';
                        if accept_state=1  then
                            businessState := 'dszsc';
                            if mortem_state=4  then
                                businessState := 'ysth';
                            end if;
                            --實審開始
                            if substanceresult is not null then
                                    if issubmit is not null then
                                            if issubmit=1 then
                                                    if substanceresult=0  then
                                                            businessState := 'szscbtg';
                                                    elsif substanceresult=1  then
                                                            businessState := 'szsctg';
                                                            if isquit=1 then
                                                                    if back_app_state is not null then
                                                                            businessState := 'isquit_money_app_state' || back_app_state;
                                                                    end if;
                                                            else
                                                                    businessState := 'dbzys';
                                                                    if iscomplete=1 then
                                                                            businessState := 'ybzys';
                                                                            if gather_state=1  then
                                                                                    if app_state is not null then
                                                                                            businessState := 'declare_state' || app_state;
                                                                                    end if;
                                                                            end if;
                                                                    end if;
                                                            end if;
                                                    elsif substanceresult=2  then
                                                            businessState := 'qxzz';
                                                    end if; 
                                            end if;
                                    end if;
                            end if;
                            --實審結束
                        end if;
                    end if; 
                elsif BUS_STATE=2 then
                    businessState := 'thgys';
                    if formalcensor=0  then
                        businessState := 'xsscbtg';
                    end if;
                end if; 
            end if;
            
       --增長記錄     
       rs.extend;
       DBMS_OUTPUT.put_line (rs.count);
       rs(rs.count) := htjs_business_state_row_type(bissid,businessState);
    end loop;
return rs;
end fun_htjs_business_state;
 ui

相關文章
相關標籤/搜索