热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

存储过程中创建临时表的注意事项和demo

存储过程中创建临时表的注意事项和demo在ORACLE存储过程中创建临时表存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行--ONCOMMITDELETEROWS说明临时表是事务指定,每次提交后ORACLE将截断...SyntaxHighlighter.all(

存储过程中创建临时表的注意事项和demo
 
在ORACLE存储过程中创建临时表 
存储过程里不能直接使用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;
 
上面建立一个临时表的存储过程
  www.2cto.com  
下面是执行一些操作,向临时表写数据。
 
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   www.2cto.com  
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;
  www.2cto.com  
需要创建一个临时表,请举例说明,谢谢!       
  ---------------------------------------------------------------       
      
  是TEMPORARY       
  CREATE     GLOBAL     TEMPORARY     TABLE     flight_schedule     (       
            startdate     DATE,           
            enddate     DATE,           
            cost     NUMBER)       
      
  ---------------------------------------------------------------       
      
  create     proecdure     name_pro       
  as       
  str     varchar2(100);       
  begin       
  str:=&#39;CREATE     GLOBAL     TEMPORARY     TABLE     TABLENAME     ON     COMMIT     PRESERVE     ROWS     as     select     *     from     others_table&#39;;       
  execute     immediate     str;       
  end;       
  /   
 
  可以把临时表指定为事务相关(默认)或者是会话相关:   
  ON   COMMIT   DELETE   ROWS:指定临时表是事务相关的,Oracle在每次提交后截断表。   
  ON   COMMIT   PRESERVE   ROWS:指定临时表是会话相关的,Oracle在会话中止后截断表。   
    
  =================   
  可以创建以下两种临时表:   
  1。会话特有的临时表   
        CREATE   GLOBAL   TEMPORARY     ()   
        ON   COMMIT   PRESERVE   ROWS;   
  ========  www.2cto.com  
  对全局临时表的总结   
    
  在临时表上的操作比在一般的表上的操作要快。因为:   
  1创建临时表不需要往编目表中插入条目,临时表的使用也不需要访问编目表,因此也没有对编目表的争用。   
  2仅有创建临时表的app才可存取临时表,所以在处理临时表时没有锁。   
  3如果指定NOT   LOGGED选项,在处理临时表时不记日志。所以如果有仅在数据库的一个会话中使用的大量临时数据,把这些数据存入临时表能大大提高性能。   
  DECLARE   GLOBAL   TEMPORARY   TABLE   TT(C1   INT,   C2   CHAR(20));   
  在CONNECT   RESET命令后,临时表不再存在。   
  建临时表是动态编译的,所以对临时表的使用也必须放在DECLARE   CURSER   后面   
  CREATE   PROCEDURE   INSTT2(P1   INT,   P2   CHAR(20))   
  BEGIN   
      DECLARE   GLOBAL   TEMPORARY   TABLE   TT(C1   INT,   C2   CHAR(20))   %   
      INSERT   INTO   SESSION.TT   VALUES(P1,   P2);   
      BEGIN   
          DECLARE   C1   CURSOR   WITH   RETURN   FOR   SELECT   *   FROM   SESSION.TT;   
      END;   
  END   %   
    
  2。事务特有的临时表   
        CREATE   GLOBAL   TEMPORARY     ()   
        ON   COMMIT   DELETE   ROWS;   
        
      在Oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了,这与MS和Sybase不一样。实际上在断开数据库连接时,临时表中数据自动清空,不同的Session之间是隔离的,不许要当心相互影响,不过如果起用了连接共享的话,你要用On   Commit   delete   rows使数据仅在事物内部有效。
  www.2cto.com  
3建立临时表   
        临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效.     
        建立方法:   
  1)   ON   COMMIT   DELETE   ROWS   定义了建立事务级临时表的方法.   
  CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area   
                  (startdate   DATE,   
                    enddate   DATE,   
                    class   CHAR(20))   
              ON   COMMIT   DELETE   ROWS;   
  EXAMPLE:   
  SQL>   CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area   
      2                     (startdate   DATE,   
      3                       enddate   DATE,   
      4                       class   CHAR(20))   
      5                 ON   COMMIT   DELETE   ROWS;   
  SQL>   create   table   permernate(   a   number);   
  SQL>   insert   into   admin_work_area   values(sysdate,sysdate,&#39;temperary   table&#39;);   
  SQL>   insert   into   permernate   values(1);   
  SQL>   commit;   
  SQL>   select   *   from   admin_work_area;   
  SQL>   select     *   from   permernate;   
    A   
  1   
  2)ON   COMMIT   PRESERVE   ROWS   定义了创建会话级临时表的方法.   
  CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area   
                  (startdate   DATE,   
                    enddate   DATE,   
                    class   CHAR(20))   
            ON   COMMIT   PRESERVE   ROWS;   
  EXAMPLE:   
      www.2cto.com  
  会话1:   
  SQL>   drop   table   admin_work_area;   
  SQL>   CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area   
      2                     (startdate   DATE,   
      3                       enddate   DATE,   
      4                       class   CHAR(20))   
      5               ON   COMMIT   PRESERVE   ROWS;   
  SQL>   insert   into   permernate   values(2);   
  SQL>   insert   into   admin_work_area   values(sysdate,sysdate,&#39;session   temperary&#39;);   
  SQL>   commit;   
  SQL>   select   *   from   permernate;   
                    A   
  ----------   
                    1   
                    2   
    
  SQL>   select   *   from   admin_work_area;   
    
  STARTDATE     ENDDATE         CLASS   
  ----------   ----------   --------------------   
  17-1ÔÂ   -03   17-1ÔÂ   -03   session   temperary   
      www.2cto.com  
  会话2:   
    
  SQL>   select   *   from   permernate;   
    
                    A   
  ----------   
                    1   
                    2   
    
  SQL>   select   *   from   admin_work_area;   
    
    未选择行.   
    
  会话2看不见会话1中临时表的数据.  
 
 
作者 赵莫言

推荐阅读
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
汶汐_782
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有