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

在oracle的存储过程中,不能直接使用DDL语句,比如create、alter、drop、truncate等。

那如果我们想在存储过程中建立一张临时表就只能使用动态sql语句了:

create or replace procedure pro as
  str_sql varchar2(100);
begin
  -- 创建临时表
  str_sql := 'create global temporary table temp_table (
       col1 varchar2(10),
       col2 number
    ) on commit preserve rows';
  execute immediate str_sql;

  -- 使用临时表
  str_sql := 'insert into temp_table(col1, col2) values(''a'', 1)';
  execute immediate str_sql;

  -- 删除临时表
  str_sql := 'drop table temp_table';
  execute immediate str_sql;
end;

在oracle中,临时表分为会话级别(session)和事务级别(transaction)两种。

会话级的临时表在整个会话期间都存在,直到会话结束;事务级别的临时表数据在transaction结束后消失,即commit/rollback或结束会话时,

会清除临时表数据。

on commit preserve rows -- 会话级别临时表(退出登录会结束会话)

on commit delete rows -- 事务级别临时表(提交或回滚会结束事务)

临时表优缺点:

1. 在仅仅查询数据时建议使用游标。

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

时间: 2024-11-07 10:03:48

在oracle存储过程中创建临时表的相关文章

在oracle存储过程中创建暂时表

在oracle的存储过程中,不能直接使用DDL语句,比方create.alter.drop.truncate等. 那假设我们想在存储过程中建立一张暂时表就仅仅能使用动态sql语句了: create or replace procedure pro as str_sql varchar2(100); begin -- 创建暂时表 str_sql := 'create global temporary table temp_table ( col1 varchar2(10), col2 number

mysql实例:在存储过程中创建临时表

在mysql的存储过程创建临时表的例子,是学习mysql 临时表操作的不错的例子. 操作步骤: mysql> mysql> mysql> CREATE TABLE Employee( //创建普通表 -> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), ->

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

Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Varchar2) AUTHID CURRENT_USER AS --声明异常 some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition v_ErrorCode NUMBER; -- Variable to hold

sqlserver 存储过程中使用临时表到底会不会导致重编译

曾经在网络上看到过,SqlServer的存储过程中使用临时表,会导致执行计划无法重用, 运行时候会导致重编译的这么一个说法,自己私底下去做测试的时候,根据profile的跟踪结果, 如果不是统计信息变更导致导致的重编译,单单是使用临时表,并不会导致重编译, 但是对于一些特殊的情况,又确实会出现重编译的, 为了弄清楚这个问题,查阅了大量的资料,才把这个问题弄清楚,这里特意记录下来,希望武断地认为存储过程中使用了临时表就会导致重编译的这个观点得到纠正. 首先进行下面的测试,我们知道,导致临时表重编译

存储过程中新建临时表的

要写一个存储过程,如果临时表 test 不存在 ,新建临时表,如果存在不新建 alter procedure testas     if object_id('tempdb..#test') is null         begin             print '不存在'             create table #test (                 number int not null primary key,                 message va

InMemory:在内存中创建临时表和表变量

在Disk-Base数据库中,如果系统频繁地创建和更新临时表,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL Server 2016的内存(Memory-Optimized)数据库中,如果考虑使用内存优化结构来存储临时表,表变量,表值参数的数据,那么将完全消除IO操作的负载消耗,发挥大内存的优势,大幅提高数据库的性能. 在SQL Server 2016中,能够直接创建内存优化的表类型,表变量和表值参数的数据只存储在内存中:不能直接在内存中创建临时表,但是,SQ

如何在oracle 12c中创建普通用户

-------如何在oracle 12c中创建普通用户------- [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sun Nov 29 21:43:50 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edit

Oracle存储过程中跳出循环的写法

Oracle存储过程中跳出循环的写法 博客分类: oracle Oracle 记录exit和return的用法 exit用来跳出循环 loop IF V_KBP IS NULL THEN           EXIT;    END IF; end loop; return跳出存储过程 loop IF V_KBP IS NULL THEN         return;    END IF; end loop; 跳出loop 一次循环 oracle 11g已提供continue; oracle

Oracle 存储过程中的 =>

oracle实参与形参有两种对应方式1.一种是位置方式,和面向对象语言参数传递类似;2.另外一种是=> 作为形参对应,因为位置对应方法有缺限,比如一个函数有3个参数,但第2个是可以不传(有默认值),这里就没办法位置对应方法,oralce内部一般用此种方法作参数传递. CREATE OR REPLACE PROCEDURE HelloWorld( p_user_name VARCHAR2, p_val1 VARCHAR2 DEFAULT ' Good Moning,', p_val2 VARCHA