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

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

下面是执行一些操作,向临时表写数据。

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;

需要创建一个临时表,请举例说明,谢谢!

---------------------------------------------------------------

是TEMPORARY

CREATE     GLOBAL     TEMPORARY     TABLE     flight_schedule     (

startdate     DATE,

enddate     DATE,

cost     NUMBER)

---------------------------------------------------------------

create     proecdure     name_pro

as

str     varchar2(100);

begin

str:='CREATE     GLOBAL     TEMPORARY     TABLE     TABLENAME     ON

COMMIT     PRESERVE     ROWS     as     select     *     from

others_table';

execute     immediate     str;

end;

/

可以把临时表指定为事务相关(默认)或者是会话相关:

ON   COMMIT   DELETE   ROWS:指定临时表是事务相关的,Oracle在每次提交后截断表。

ON   COMMIT   PRESERVE   ROWS:指定临时表是会话相关的,Oracle在会话中止后截断表。

=================

可以创建以下两种临时表:

1。会话特有的临时表

CREATE   GLOBAL   TEMPORARY     ()

ON   COMMIT   PRESERVE   ROWS;

========

对全局临时表的总结

在临时表上的操作比在一般的表上的操作要快。因为:

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使数据仅在事物内部有效。

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,'temperary   table');

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:

会话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,'session   temperary');

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

会话2:

SQL>   select   *   from   permernate;

A

----------

1

2

SQL>   select   *   from   admin_work_area;

未选择行.

会话2看不见会话1中临时表的数据.

posted on 2009-02-26 17:29 SIMONE 阅读(7005) 评论(0)  编辑  收藏 所属分类: oracle

java 创建临时表 oracle_在ORACLE存储过程中创建临时表相关推荐

  1. oracle临时表教程,在oracle存储过程中创建临时表

    在oracle的存储过程中,不能直接使用DDL语句,比如create.alter.drop.truncate等. 那如果我们想在存储过程中建立一张临时表就只能使用动态sql语句了: create or ...

  2. mysql 存储过程临时表_在MySQL存储过程中创建的临时表的范围

    问题撤销!当我拼写正确的一切,问题消失了! 我有一个MySQL存储过程创建一个临时表.当我从mysql提示符调用过程时,它似乎运行成功,但是如果我从临时表中选择COUNT(*),我会收到一个错误,表示 ...

  3. 在oracle存储过程中创建临时表

     在oracle的存储过程中,不能直接使用DDL语句,比如create.alter.drop.truncate等. 那如果我们想在存储过程中建立一张临时表就只能使用动态sql语句了: [sql] ...

  4. mysql语句创建临时表并存入数据_mysql实例:在存储过程中创建临时表并储存数据...

    在mysql存储过程中创建临时表,并保存数据到该表,然后根据存储过程调用的例子. 是学习mysql存储过程的好例子,值得参考. 代码: mysql> mysql> CREATE TABLE ...

  5. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  6. Oracle数据库中的临时表

    概述 写这篇文章的起因,是由于客户存在这样的场景.每次登录时,需要创建一些临时表(业务上临时),然后插入一些数据,返回到客户端,然后删除这些表.最初用户用的是普通表,带来很大的开销.后来改为Globa ...

  7. oracle存储过程ddl,Oracle 存储过程中的DDL语句

    Oracle的存储过程,是我们使用数据库应用开发的重要工具手段.在存储过程中,我们大部分应用场景都是使用DML语句进行数据增删改操作.本篇中,我们一起探讨一下数据定义语句DDL在存储过程中使用的细节和 ...

  8. oracle数据存储过程 中的循环 for 拼接字符串,oracle存储过程中使用字符串拼接

    1.使用拼接符号"||" v_sql := 'SELECT * FROM UserInfo WHERE ISDELETED = 0 AND ACCOUNT =''' || vAcc ...

  9. 布尔类型(boolean)在oracle存储过程中支持情况

    文章目录 1.布尔类型在oracle存储过程中支持情况 (1)布尔类型在过程.函数.包中的支持情况 (2)布尔类型与其他类型的兼容情况 (3)布尔类型作为cast函数参数情况 (4)存储过程case- ...

最新文章

  1. Python_基础_1
  2. python创建tcp socket_Python Socket如何建立TCP连接
  3. 【万里征程——Windows App开发】控件大集合1
  4. Qt笔记-窗口程序在任务栏中隐藏及永久置顶
  5. 一页纸API快捷免费高速api接口
  6. rust投递箱连接箱子_拆了的快递包装丢哪里?闵行试行24小时开放的网购包装回收箱...
  7. linux下nginx的基本使用
  8. 什么是机器学习?(上)
  9. 函数-在函数里修改列表数据
  10. FBreader问题记录及多端同步心得开篇
  11. echarts 横向柱状图
  12. AUTOSAR入门介绍
  13. day05数据类型(上)
  14. 【阵列信号处理】DOA估计之MUSIC算法
  15. c语言的位取反和按位异或
  16. 相似度80%,Apache 孵化项目 StreamPark被公然抄袭!
  17. 量变才会质变,质变最后才会解决问题
  18. 驱动开发 LED灯驱动
  19. 创建数据库表格的方法
  20. 牛客网 2018校招真题 京东 回文

热门文章

  1. 时间控件date-picker 时间差计算
  2. 真正的精英程序员是什么样的?共勉!
  3. cocos creator - 龙骨动画的适配
  4. 乱码(一): 北京西直门迷路与乱码困惑
  5. 关闭WordPress站内容搜,杜绝违禁词在站内恶意搜索
  6. 文件服务器主机名访问,如何通过主机名访问共享文件
  7. vue-cli 4.0安装及项目搭建
  8. t972和鸿蒙818,电视芯片学问大 鸿鹄818与Amlogic T972哪家强
  9. 畅想 AI 未来 | CDA经管之家·人工智能地图2.0发布会圆满落幕
  10. adb 报错error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:65533