1. 程式人生 > >Oracle儲存過程,臨時表的建立、刪除,變數的定義和使用

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

[email protected] u where u.last_date <  :1 '  ;
       execute immediate tabData using timePoint;
       commit;
     end;
     dbms_output.put_line(tabData);
      select max(rownum) into maxRow from [email protected] 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;