当前位置:首页 » 存储配置 » oracle存储过程创建临时表

oracle存储过程创建临时表

发布时间: 2022-09-26 00:46:30

㈠ oracle 在存储过程中动态的建一个临时表使用和在数据库里写死一个临时表使用两者有什么区别

我们仍使用实验 05中的环境,略去准备数据的过程。

我们仍然使用两个会话,一个会话 run,用于运行主 sql;另一个会话 ps,用于进行 performance_schema 的观察:

主会话线程号为 29,

可以看到写入的线程是 page_clean_thread,是一个刷脏操作,这样就能理解数据为什么是慢慢写入的。

也可以看到每个 IO 操作的大小是 16K,也就是刷数据页的操作。


结论:

我们可以看到,

1. MySQL 会基本遵守 max_heap_table_size 的设定,在内存不够用时,直接将表转到磁盘上存储。

2. 由于引擎不同(内存中表引擎为 heap,磁盘中表引擎则跟随 internal_tmp_disk_storage_engine 的配置),本次实验写磁盘的数据量和实验 05中使用内存的数据量不同。

3. 如果临时表要使用磁盘,表引擎配置为 InnoDB,那么即使临时表在一个时间很短的 SQL 中使用,且使用后即释放,释放后也会刷脏页到磁盘中,消耗部分 IO。

㈡ oracle存储过程中临时表的使用,该怎么处理

1、Oracle临时表分两种,事务级临时表和会话级临时表
2、事务级临时表在事务结束后会被清空,会话级临时表在事务结束后不会清空而是在回话结束会自动清空。
3、如果是在存储过程用临时表并不需要从临时表里把数据返回到存储过程之外的用事务级临时表即可;如果要从临时表里把数据返回到存储过程之外则需要用会话级临时表(这个跟mssql不一样,mssql用事务级临时表也可以返回结果)
注:存储过程里使用会话级临时表时,往临时表里插入数据前要先清空临时表内的数据

㈢ oracle中,存储过程建的临时表

create table tmp_临时表 as select * from 表名 ;// 这边是创建临时表再将数据添加到临时表

insert into tmp_临时表 select * from 表名 ; // 和上面的一样,但是这个是临时表已经存在新增数据

㈣ oracle存储过程中临时表的使用,该怎么处理

1、Oracle临时表分两种,事务级临时表和会话级临时表
2、事务级临时表在事务结束后会被清空,会话级临时表在事务结束后不会清空而是在回话结束会自动清空。
3、如果是在存储过程用临时表并不需要从临时表里把数据返回到存储过程之外的用事务级临时表即可;如果要从临时表里把数据返回到存储过程之外则需要用会话级临时表(这个跟mssql不一样,mssql用事务级临时表也可以返回结果)
注:存储过程里使用会话级临时表时,往临时表里插入数据前要先清空临时表内的数据

㈤ ORACLE存储过程创建临时表并插入数据。

存储过程创建表后,在编译阶段数据库中并没有该表。这时向表中插入数据,会提示表不存在。所以,插入语句要赋值到变量里,通过e来执行。

㈥ oracle中的临时表

临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别。它只能存储在临时表空间,而非用户的表空间。ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。

ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。
1)ON COMMIT DELETE ROWS
它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
2)ON COMMIT PRESERVE ROWS
它表示临时表的内容可以跨事物而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
1:会话级的临时表的数据和你当前会话有关系,当前SESSION不退出的情况下,临时表中的数据就还存在,临时表的数据只有当你退出当前SESSION的时候才被截断(TRUNCATE TABLE),如下所示:
会话级别的临时表创建:
复制代码
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS
AS
SELECT * FROM TEST;
操作示例:
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------
1 kerry
SQL> INSERT INTO TMP_TEST
SELECT 2, 'rouce' FROM DUAL;
1 row inserted
SQL> ROLLBACK;
Rollback complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------------
1 kerry
SQL>
复制代码

2:事务级的临时表(默认),这种类型的临时表与事务有关,当进行事务提交或者事务回滚的时候,临时表的数据将自行截断,即当COMMIT或ROLLBACK时,数据就会被TRUNCATE掉,其它的特性和会话级的临时表一致。
事务级临时表的创建方法:
复制代码
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------------
1 kerry
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ------------------------
SQL>
复制代码

3:关于临时表只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
用DM用户登录数据库,打开SESSION 1后,创建临时表TMP_TEST

复制代码
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ---------------------
1 kerry
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- -----------------------
SQL>
复制代码

用sys用户登录数据库,打开SESSION 2
SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST' --可以查到临时表数据
SELECT * FROM DM.TMP_TEST; --查不到数据,即使TMP_TEST临时表存在数据。

临时表与永久表区别
复制代码
SQL> SELECT TABLE_NAME, TABLESPACE_NAME,"LOGGING",
"TEMPORARY", DURATION, "MONITORING"
FROM DBA_TABLES WHERE TABLE_NAME IN ('TMP_TEST', 'TEST') ;
TABLE_NAME TABLESPACE_NAME LOGGING TEMPORARY DURATION MONITORING
------------- -------------- ------- --------- ----------- ---------
TEST TBS_EDS_DATA YES N YES
TMP_TEST NO Y SYS$SESSION NO
复制代码

㈦ oracle使用存储过程创建临时表提示ORA-24344: success with compilation error

str:='INSERTINTOTEMP_ACTIVITY(
SELECT
TO_CHAR(A1."FEndTime",'YYYY')||'年'||TO_CHAR(A1."FEndTime",'MM')||'月'||TO_CHAR(A1."FEndTime",'DD')||'日'AS"ActivityDate",
A2."FName"AS"ActivityUser",
A1."FSFPlan"AS"ActivityPLan",
A3."FName"AS"ActivityCustomer",
A1."FDescription"AS"Activity",
A1."FAttainment"AS"Attainment",
A1."FDescriptios"AS"Descriptios"
FROM"TcActivity"A1
LEFTJOIN"TsUser"A2ONA2."FId"=A1."FUserId"
LEFTJOIN"YstCustomer"A3ONA3."FId"=A1."FCustomerId")';

把这个sql 输出来看看,多了一个“(”。

㈧ ORACLE 存储过程中创建了临时表,但是查询该临时表时,编译 提示‘表或者视图不存在’,求高手解答。

当然会报这个错误了,编译的时候没有这个对象(select * from PRTLSTDEL_TMP)肯定会出错,编译不成功就不能执行,不能执行这个临时表就创建不了。

怎么会有这么奇葩的需求?

你要把select * from PRTLSTDEL_TMP这里也变成动态的才行

就算改好了成功了, 你的程序也只能执行一次,因为"v_sqlcreate := 'create global temporary table PRTLSTDEL_TMP(" 会报对象已存在

热点内容
我的世界服务器开服包 发布:2024-05-01 17:18:30 浏览:900
收费下载站源码 发布:2024-05-01 16:49:01 浏览:975
压缩下载啥 发布:2024-05-01 16:42:32 浏览:724
安卓手机预装系统软件放在哪里的 发布:2024-05-01 16:37:41 浏览:837
南京java培训机构 发布:2024-05-01 16:33:34 浏览:366
存储系统的ppt 发布:2024-05-01 16:33:22 浏览:192
洪荒修真为什么服务器不一样 发布:2024-05-01 16:32:16 浏览:176
在c语言中o 发布:2024-05-01 16:29:15 浏览:793
神速流量卡密码在哪里兑换 发布:2024-05-01 16:21:10 浏览:395
c语言中3d是什么意思 发布:2024-05-01 15:43:40 浏览:840