Oracle存儲過程,臨時表的創建、刪除,變量的定義和使用

 

create or replace procedure Test_GetOaUserInfo  as
  --authid current_user操作當前存儲過程的當前用戶,否則提示權限不足,但是這樣存儲過程這能執行一次
  --,或者GRANT CREATE ANY TABLE TO any users;
 timePoint  Date;
 tabCstr varchar2(1000);     --創建表的字符串
 varNum number(1) default 0;   --定義統計記錄變量默認爲0
 tabDstr varchar2(500);      --存數據的字符串
 tabData varchar2(500);      -- 存數據的字符串
 maxRow number;

begin
   --抓取截止日期
   select  max(last_date) into timePoint from basedb_users;
   --存取表的記錄數
   select count(*) into varNum from user_tables where table_name='BASEDB_USERS_TEMP_TB';
   if timePoint is null then
      begin
          timePoint:=sysdate;
      end;
    end if;
    dbms_output.put_line(to_char(timePoint,'YYYY-mm-dd hh24:mm:ss')); --set serveroutput on
    dbms_output.put_line(varNum);
   
    --創建臨時表
   if varNum < to_number(1) then   --如果沒有數據表創建臨時表
        --dbms_output.put_line('執行了啊');
        tabCstr := 'create global temporary table BASEDB_USERS_TEMP_TB(
            ID           INTEGER not null,
            LOGINID      VARCHAR2(15),
            FIRSTNAME    VARCHAR2(30),
            LASTNAME     VARCHAR2(60),
            FULLNAME     VARCHAR2(100),
            SEX          CHAR(1),
            JOBTITLE     INTEGER,
            SUBCOMPANYID INTEGER,
            DEPARTMENTID INTEGER,
            MANAGEID     INTEGER,
            WORKCODE     VARCHAR2(15),
            LAST_DATE    DATE,
            ACTION_SIGN  CHAR(1),
            STATUS       CHAR(1),
            PASSWORD     VARCHAR2(50)
        )ON COMMIT PRESERVE ROWS '; --ON COMMIT PRESERVE ROWS 會話級臨時表 ,ON COMMIT delete ROWS 事務級臨時表
        execute immediate tabCstr;--執行DDL語句
     end if;
     --導入數據到臨時表中
     begin
       tabData := 'insert into BASEDB_USERS_TEMP_TB(id,fullname)
       select to_number(u.id) id,u.fullname from FMASTER.basedb_users@linkoa u where u.last_date <  :1 '  ;
       execute immediate tabData using timePoint;
       commit;
     end;
     dbms_output.put_line(tabData);
      select max(rownum) into maxRow from FMASTER.basedb_users@linkoa u where u.last_date < timePoint;  --查詢中最大記錄數
     commit;
     dbms_output.put_line('記錄數'||maxRow);
    
    --刪除臨時表
    --tabDstr := 'truncate table BASEDB_USERS_TEMP_TB ';
    --execute immediate tabDstr; 
    --tabDstr := 'drop table BASEDB_USERS_TEMP_TB ';
    --execute immediate tabDstr; 
    --  commit;  
end Test_GetOaUserInfo;

發佈了54 篇原創文章 · 獲贊 6 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章