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
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;