1. 程式人生 > >Oracle 儲存過程樣例

Oracle 儲存過程樣例

公司的在儲存過程樣例,主要是從O表抽取資料到DW表中,在抽取資料的過程中  記錄了一些 日誌訊息  ,寫入到一個日誌表中。通過日誌表可以檢視儲存過程執行情況。

樣例參考學習:

CREATE OR REPLACE PROCEDURE IPMSDW.SP_DW_MY_TEST (v_day_start in date, v_day_num in int) is  --v_day_start為開始時間,v_day_num為迴圈次數
     v_day_id_begin    date;
     v_day_id_end      date;
     i                  int;
     v_step_id          varchar2(20);
     v_sql_clob         clob;
     v_sql              varchar2(32767);
     v_sql_insert       varchar2(32767);
     v_sql_select       varchar2(32767);
     v_log_id           number;
     v_sp_name          varchar2(50);
     V_SQLERRM          varchar2(200);
begin
  --liuxiangke 2017.11.20

    v_log_id := TO_NUMBER(TO_CHAR(sysdate, 'yyyymmddhh24miss'));--系統當前時間為日誌ID 例如'20170920003001'
    v_sp_name :='SP_DW_MY_TEST';

    v_step_id := '1';
    insert into IPMSDW.LOG_SP_DW_TEST(ID, SP_NAME, STATSTIME, sql, LOG) values(v_log_id,v_sp_name,sysdate,'begin',v_step_id ) ;--日誌開始
    commit;
    
    i := 0;
    while i<v_day_num loop  --迴圈開始,v_day_num 迴圈最大次數
        v_day_id_begin := trunc(v_day_start) + i; --begin開始天時間
        v_day_id_end := v_day_id_begin + 1;  --end結束時間

       --把需要匯聚的 時間裡  資料清除。
        v_sql :='delete from IPMSDm.dm_re_st_hywg_n31_14_d where start_time=to_date('''||TO_CHAR(v_day_id_begin, 'yyyy-mm-dd hh24:mi:ss')||''',''yyyy-mm-dd hh24:mi:ss'')';
        dbms_lob.createtemporary(v_sql_clob,TRUE);--清空變數 v_sql_clob
        dbms_lob.append(v_sql_clob,v_sql);--追加字串,給v_sql_clob賦值
        v_step_id := 'delete_1';
        insert into IPMSDm.LOG_SP_Dm(ID, SP_NAME, STATSTIME, sql, LOG) values( v_log_id,v_sp_name,sysdate,v_sql_clob,v_step_id ) ;
        execute immediate v_sql_clob;
        commit;

        v_sql_insert := '
        insert into  ipmsdm.dm_re_st_hywg_n31_14_d
(
  start_time                         ,
  end_time                           ,
  hywgn_send_total_num               ,
  hywgn_ec_to_gw_num                 ,
  hywgn_smc_to_gw_num                ,
  hywgn_gw_to_gw_num                 ,
  gw_send_rpt_num_ok_ratio           ,
  hywgn_send_rate                    ,
  hywgn_sm_peak                      ,
  hywgn_lisence
)';
        v_sql_select := '
/*select
to_date('''|| TO_CHAR(v_day_id_begin, 'yyyy-mm-dd hh24:mi:ss') ||''',''yyyy-mm-dd hh24:mi:ss'') as starttime,   
to_date('''|| TO_CHAR(v_day_id_end, 'yyyy-mm-dd hh24:mi:ss') ||''',''yyyy-mm-dd hh24:mi:ss'') as  endtime,                                                                                         
sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num)                                               ,
sum(ec_to_gw_num)                                                                                      ,
sum(smc_to_gw_num)                                                                                     ,
sum(gw_to_gw_num)                                                                                      ,
case when sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num) <> 0 then round(sum(gw_send_rpt_num_ok)/sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num),2) else 0 end       ,
 round(sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num)/300,2)                                  ,
sum(sm_peak)            ,
sum(lisence)
from ipmsdw.O_RE_ST_HYWG_N31_14_5M a
where starttime >= to_date('''|| TO_CHAR(v_day_id_begin, 'yyyy-mm-dd hh24:mi:ss') ||''',''yyyy-mm-dd hh24:mi:ss'')
  and starttime <  to_date('''|| TO_CHAR(v_day_id_end, 'yyyy-mm-dd hh24:mi:ss') ||''',''yyyy-mm-dd hh24:mi:ss'')*/
  select
trunc(starttime,''dd'') as starttime,   
trunc(starttime+1,''dd'') as  endtime,                                                                                         
sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num)                                               ,
sum(ec_to_gw_num)                                                                                      ,
sum(smc_to_gw_num)                                                                                     ,
sum(gw_to_gw_num)                                                                                      ,
case when sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num) <> 0 then round(sum(gw_send_rpt_num_ok)/sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num),2) else 0 end       ,
 round(sum(ec_to_gw_num+smc_to_gw_num+gw_to_gw_num)/300,2)                                  ,
sum(sm_peak)            ,
sum(lisence)
from ipmsdw.O_RE_ST_HYWG_N31_14_5M a
where starttime >= to_date('''|| TO_CHAR(v_day_id_begin, 'yyyy-mm-dd hh24:mi:ss') ||''',''yyyy-mm-dd hh24:mi:ss'')
  and starttime <  to_date('''|| TO_CHAR(v_day_id_end, 'yyyy-mm-dd hh24:mi:ss') ||''',''yyyy-mm-dd hh24:mi:ss'')
group by trunc(starttime,''dd''),trunc(starttime+1,''dd'')';
        dbms_lob.createtemporary(v_sql_clob,TRUE); --清空v_sql_clob
        dbms_lob.append(v_sql_clob,v_sql_insert);  --追加v_sql_insert給v_sql_clob
        dbms_lob.append(v_sql_clob,v_sql_select);--追加v_sql_select給v_sql_clob
        v_step_id := 'insert_1';
        insert into IPMSDm.LOG_SP_Dm(ID, SP_NAME, STATSTIME, sql, LOG) values( v_log_id,v_sp_name,sysdate,v_sql_clob,v_step_id ) ;
        commit;
        execute immediate v_sql_clob;
        commit;

        i := i + 1;
    end loop;
exception    --異常情況
  when others then
    V_SQLERRM := sqlerrm;  --sqlerrm異常資訊  ,只能賦值給變數獲取異常資訊。
    rollback;
    insert into IPMSDW.LOG_SP_DW_TEST(ID, SP_NAME, STATSTIME, sql, LOG) values( v_log_id,v_sp_name,sysdate,v_sql_clob,V_SQLERRM ) ;
    insert into IPMSDW.LOG_SP_DW_TEST(ID, SP_NAME, STATSTIME, sql, LOG) values( v_log_id,v_sp_name,sysdate,'end','5' ) ;
    commit;
end;


相關推薦

Oracle 儲存過程

公司的在儲存過程樣例,主要是從O表抽取資料到DW表中,在抽取資料的過程中  記錄了一些 日誌訊息  ,寫入到一個日誌表中。通過日誌表可以檢視儲存過程執行情況。 樣例參考學習: CREATE OR REPLACE PROCEDURE IPMSDW.SP_DW_MY_TEST

Oracle儲存過程的簡單舉例

一、建立測試資料 --建立測試資料: create table person(編號 number(10),姓名 varchar2(20),密碼 varchar2(20)); insert into person values(1,'xzw','888'); select * from p

Oracle儲存過程例項分析總結(程式碼)

1.儲存過程結構 1.1 第一個儲存過程 ? 1 2 3 4

java面試問題:oracle儲存過程(procedure)和函式(function)的區別

oracle儲存過程(procedure)和函式(function)的區別 儲存過程 函式 用於在資料庫中完成特定的操作或者任務(如插入、刪除等) 用於特定的資料(如選擇)

Oracle儲存過程基礎內容

1 基本語法 1.1 無參無變數 create or replace procedure firstPro as begin dbms_output.put_line('hello word, my name is stored procedure'); end;

oracle 儲存過程 例項 迴圈 給查詢賦值 遊標取值

CREATE OR REPLACE PROCEDURE p_updete_gs is     --僅供參考   i_jdid varchar(32);   i_ryid varchar(32);   cursor cur is --

C#呼叫ORACLE儲存過程返回結果集

Oracle中scott使用者下建立儲存過程: (注:從9i開始有了sys_refcursor這種型別,在以前的Oracle版本中需要使用REF CURSOR,並且還需放在一個程式包中) create or replace procedure sp_getdept (result

Oracle儲存過程學習筆記(一)

SQL是一種語言! 一、先看一部分基礎: 也可參考該文章:https://www.cnblogs.com/Singleorb/p/6217268.html; 1、語法  CREATE OR REPLACE PROCEDURE 儲存過程名字     (      引數1 IN NUMBER,

Oracle 儲存過程中傳送郵件,並支援使用者驗證 中文標題和內容

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

oracle 儲存過程 報 無效字元

lv_sql:='   insert into ETL_SUCESS_AMOUNT   select SEQ_OS_ETL_AMOUNTID.NEXTVAL AS AMOUNTID,1,AMOUNT_DATA,AMOUNT_HOUR,   serviceid,porta

Oracle儲存過程(1)

(一)儲存過程的基本語法   1  CREATE OR REPLACE PROCEDURE 儲存過程名   2  IS   3  BEGIN   4  

【學亮開講】Oracle儲存過程教學筆記(二)20181116

--帶出參的儲存過程的建立和呼叫 create or replace procedure pro_owners_add1 ( v_name varchar2,--名稱 v_addressid number,--地址編號 v_housenumber varchar2,--門牌號 v_wat

Oracle儲存過程的優化

Oracle儲存過程的優化措施 1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“user_name.table_name”。 2、開發人員在提交前,必須已經分析過查詢計劃,做過自身的查詢優化檢查。 3.SQL的使用規範: 3.

Oracle儲存過程以及遊標

一.儲存過程 1、儲存過程定義 所謂儲存過程(Stored Procedure),就是一組用於完成特定資料庫功能的SQL語句集,該SQL語句集經過 編譯後儲存在資料庫系統中。在使用時候,使用者通過指定已經定義的儲存過程名字並給出相應的儲存過程引數 來呼叫並執行它,從而完成一個或一系列的資料庫

Oracle 儲存過程小結 遊標 ,隨機生成UUID(32位)

    業務需求:            今天領導要求後天批量插入修改資料,將A表中的資料一條條的插入到B表中,中間還夾雜這業務邏輯。  技術需求:      

oracle 儲存過程 傳送WebServie 請求

create or replace procedure CMS_TO_ESB_INTEGRAL is --呼叫ESB積分錯誤是重發介面 http_req utl_http.req; http_resp utl_http.resp; request_env clob; l_re

Oracle:儲存過程的使用

Oracle:儲存過程的使用 以sys身份登入,建立使用者c##zs,密碼111,分配dba角色 以c##zs身份登入,匯入資料表 編寫儲存過程,根據學生學號,查詢出學生所選課程成績等級, 列印結果示例: 1801001 張三 Oracle A 1801001 張三 Java C 參

oracle儲存過程把查詢到的值更新到別的表

create or replace procedure update_nst_t_Clime2 as cursor c_db is select * from NST_T_FRAME f

oracle儲存過程中 RETURNING INTO的含義

DECLARE Row_id ROWID; info VARCHAR2(40); BEGIN INSERT INTO dept VALUES (91, 'SERVICE', 'BEIJING') RETURNING rowid,