在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 <TABLE_NAME> (<column specification>)
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 <TABLE_NAME> (<column specification>)
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中临时表的数据.
分享到:
相关推荐
3. **在存储过程中使用**:在存储过程中,可以直接查询、更新或删除这个临时表中的数据。 4. **结束会话**:会话结束后,临时表及其所有数据将自动消失。 ### 事务级临时表 事务级临时表(Transaction-Level ...
在存储过程中创建临时表,可以避免对永久表进行频繁的增删改操作,提高效率。 调用Oracle存储过程并处理返回的游标(Cursor)在Java中通常涉及以下步骤: 1. **建立数据库连接**:使用JDBC(Java Database ...
Oracle存储过程学习总结涵盖了Oracle中存储过程的编写与应用,涉及到字符串处理、游标使用、PL/SQL编程等方面的知识点。 首先,字符串处理是存储过程中常见的操作。文章中提到了多个内置函数,如CONCAT用于连接字符...
本文将详细介绍如何在Oracle中创建临时表,并探讨其应用场景以及两种主要类型的临时表:全局临时表(Global Temporary Table)与局部临时表(Local Temporary Table)的区别及其使用方法。 #### 二、Oracle临时表...
在Oracle数据库系统中,表空间(Tablespace)是存储数据对象(如表、索引、视图等)的逻辑单位,而临时表空间(Temporary Tablespace)则用于存储临时数据,比如排序或联接操作产生的中间结果。创建和管理表空间及...
1. **会话级临时表**:这类临时表中的数据仅在当前会话期间有效。当会话结束时,临时表中的所有数据会被自动清除。 2. **事务级临时表**:这类临时表中的数据仅在一个事务期间有效。当事务提交或回滚后,临时表中的...
Oracle 临时表用法 Oracle 临时表是一种特殊的表结构,它可以在数据库中临时存储...但是,使用临时表时需要注意一些问题,例如避免在存储过程中创建临时表,避免在运行时创建临时表,以免导致数据库中的表数量增加。
Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...
`ON COMMIT PRESERVE ROWS` 选项确保了即使在事务提交后,临时表中的数据仍保留,直到会话结束。另外,还可以选择 `ON COMMIT DELETE ROWS`,这样在事务提交时,所有行都将被删除。 在存储过程中使用临时表,我们...
在Oracle中,创建用户并为其分配默认表空间和临时表空间的命令如下: ``` create user abstest identified by abstest default tablespace abs_test temporary tablespace abs_test_temp; ``` 这里,`...
本文将详细解析一个特定的Oracle函数——`NS_DNAF_GetPaidUpDeposit`,该函数旨在执行查询操作,并将结果插入到一个临时表中。通过分析该函数的结构、参数以及执行逻辑,我们可以更好地理解其工作原理及其应用场景。...
在临时表中保存的数据只有对当前会话是可见的,任何会话都不能看到其他会话的数据,即使在当前会话 COMMIT 数据以后也是不可见的。多用户并行不是问题,一个会话从来不阻塞另一个会话使用临时表。临时表比正常表产生...
通过上述介绍,我们可以了解到Oracle存储过程的强大功能及其在实际应用中的重要意义。存储过程不仅可以帮助我们提高数据库操作的效率,还能简化复杂的业务逻辑处理,是Oracle数据库开发者不可或缺的一部分。
Oracle 临时表空间满是指数据库中的临时表空间达到最大容量,无法继续存储临时数据,影响数据库的正常运行。本文将详细介绍解决 Oracle 临时表空间满的问题的步骤。 第一步:查看当前数据库的默认临时表空间 在解决...
根据提供的Oracle存储过程示例,我们可以详细解析其中的关键知识点,包括存储过程的创建、游标的使用、临时表的创建及数据处理等。 ### 存储过程的创建与使用 存储过程是在数据库中编写的SQL代码块,它可以接受...
CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB...
Oracle存储过程是数据库管理系统Oracle中的一种重要特性,它允许开发者编写和存储PL/SQL代码,以便在需要时高效地执行。存储过程具有多种优势,包括提高性能、减少网络流量、增强安全性和简化复杂的数据库操作。 1....
- **`局部变量声明`**:在存储过程中定义局部变量,用于存储中间结果或临时数据。 #### 三、SELECT INTO语句 `SELECT INTO`语句用于将查询结果赋值给一个或多个变量。使用时需要注意以下几点: 1. **数据行要求**...
当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在用户的数据字典中。 会话级临时表 会话级临时表是指临时表中的数据只在会话生命周期中存在,当用户退出会话结束的时候,Oracle ...
这里的`ON COMMIT DELETE ROWS`选项表示当事务提交时,临时表中的所有行将被删除。 2. **使用临时表**:在会话中,你可以像操作普通表一样对临时表进行INSERT、UPDATE和SELECT等操作。但请注意,不同会话之间无法...