存储过程中使用临时表.

所谓临时表,即我们临时创建来用一下的表,也就是说这个表只是临时创建来用一会儿的,再我们使用完之后就会进行删除的表。我们在对数据库操作的时候,会常常用到一些临时的数据,这时候使用临时表来存放这些东西最合适不过了。

可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。

特性和性能(与普通表和视图的比较) :

  临时表只在当前连接内有效

  临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用

  数据处理比较复杂的时候时表快,反之视图快点

  在仅仅查询数据的时候建议用游标: open cursor for ''sql clause'';

ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,
     或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,
     但是临时表的结构以及元数据还存储在用户的数据字典中。

在Oracle8i或以上版本中,可以创建以下两种临时表:
1。会话特有的临时表
      CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
      ON COMMIT PRESERVE ROWS;
  
2。事务特有的临时表
      CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
      ON COMMIT DELETE ROWS;
     CREATE GLOBAL TEMPORARY TABLE MyTempTable


--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。

注意:oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此的数据,也就是说临时表是会话独立的。


   

create procedure pro
as
str varchar2(100);
begin
str:='CREATE GLOBAL TEMPORARY TABLE TABLENAME (
   COL1 VARCHAR2(10),
   COL2 NUMBER
) ON COMMIT PRESERVE ROWS' ;
execute immediate str;   
--使用动态SQL语句来执行
end;
/


存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行

--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。


CREATE OR REPLACE PROCEDURE temptest
(p_searchDate IN DATE)
IS
v_count INT;
str varchar2(300);
BEGIN
      v_count := 0;
str:='drop table SETT_DAILYTEST';
execute immediate str;
/*      str:='CREATE GLOBAL TEMPORARY TABLE SETT_DAILYTEST (
            NACCOUNTID NUMBER not null,
            NSUBACCOUNTID NUMBER not null)
            ON COMMIT PRESERVE ROWS';
      execute immediate str;    ----使用动态SQL语句来执行
      str:='insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance)';
      execute immediate str;
END temptest;

 

上面建立一个临时表的存储过程

下面是执行一些操作

CREATE OR REPLACE PROCEDURE PR_DAILYCHECK
(
p_Date IN DATE,
p_Office IN INTEGER,
p_Currency IN INTEGER,
P_Check IN INTEGER,
p_countNum OUT INTEGER)
IS
v_count INT;
BEGIN
      v_count := 0;
      IF p_Date IS NULL THEN
      dbms_output.put_line('´«ÈëµÄ²ÎÊý´íÎó');
      ELSE
          IF P_Check = 1 THEN
          insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
          where dtdate = p_Date);
          select
          count(sd.naccountid) into v_count
          from sett_subaccount ss,sett_account sa,sett_dailytest sd
          where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
          AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
          and rownum < 2;
          COMMIT;
          p_countNum := v_count;
          dbms_output.put_line(p_countNum);
          END IF;
          IF P_Check = 2 THEN
          insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
          where dtdate = p_Date);
          select
          count(sd.naccountid) into v_count
          from sett_cfsubaccount ss,sett_account sa,sett_dailytest sd
          where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
          AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
          and rownum < 2;
          COMMIT;
          p_countNum := v_count;
          dbms_output.put_line(p_countNum);
          END IF;
      END IF;     
END PR_DAILYCHECK;
 

例子2:

create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as

  v_num number;

  begin

  select count(*) into v_num from

  user_tables where table_name=''T_TEMP'';

  --create temporary table

  if v_num<1 then

  execute immediate ''CREATE GLOBAL TEMPORARY TABLE T_TEMP (

  COL1 VARCHAR2(10),

  COL2 VARCHAR2(10)

  ) ON COMMIT delete ROWS'';

  end if;

  --insert data

  execute immediate ''insert into t_temp values

  (''''''  v_col1  '''''',''''''  v_col2  '''''')'';

  execute immediate ''select col1 from t_temp'' into v_num;

  dbms_output.put_line(v_num);

  execute immediate ''delete from t_temp'';

  commit;

  execute immediate ''drop table t_temp'';

  end pro_temp;

  测试:

  15:23:54 SQL> set serveroutput on

  15:24:01 SQL> exec pro_temp(''11'',''22'');

  11

  PL/SQL 过程已成功完成。

  已用时间: 00: 00: 00.79

Oracle存储过程,你可以使用临时表存储临时数据。临时表是在会话级别创建的,仅在当前会话可见,并在会话结束后自动删除。以下是使用临时表的一般步骤: 1. 创建临时表使用CREATE GLOBAL TEMPORARY TABLE语句创建临时表临时表可以是全局临时表(GLOBAL TEMPORARY TABLE)或本地临时表(LOCAL TEMPORARY TABLE)。全局临时表在所有会话之间共享结构定义,但数据仅在当前会话可见。本地临时表在会话级别创建和使用,并且只在当前会话可见。 2. 定义临时表结构:在CREATE TABLE语句定义临时表的列和其他约束。 3. 在存储过程使用临时表:在存储过程,你可以像使用任何其他表一样使用临时表。你可以插入、更新、删除、查询临时表的数据,并在存储过程执行期间将其作为间结果使用。 4. 清空或删除临时表:当你需要清空或删除临时表的数据时,可以使用TRUNCATE TABLEDELETE语句。TRUNCATE TABLE语句会快速删除表的所有数据,而保留表结构。DELETE语句可以根据条件删除表的数据。 5. 存储过程结束后临时表自动删除:一旦存储过程执行完毕或会话结束,临时表会自动删除,无需手动清理。 使用临时表可以在存储过程方便地存储和处理临时数据,提高性能和简化逻辑。注意,临时表的数据仅在当前会话可见,不会对其他会话产生影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值