oracle如何将表存储
㈠ oracle 存储过程 怎么用内存表
一 临时表语法
临时表只在Oracle 8i 以及以上产品中支持。
语法:
<textarea cols="50"
rows="15" name="code" class="java:showcolumns">create global
temporary table 临时表名 on commit preserve/delete rows
--preserve:SESSION级的临时表,delete:TRANSACTION级的临时表.</textarea>
SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在
TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。
当会话退出或者用户提交commit和回滚rollback事
务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。当一个会话结束(用户正常退出、用户不正常退出、ORACLE实
例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE
语句清空临时表数据,但不会清空其它会话临时表中的数据。临时表可以使用触发器。
二 临时表ORACLE数据库与sqlserver的区别
ORACLE临时表,transaction或者session结束,会清空表数据。但是表还存在。
SQL SERVER临时表,存储在 tempdb 中,当不再使用时会自动删除。
1 SQL SERVER临时表是一种”内存表”,表是存储在内存中的。ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中;
2 SQL SERVER临时表不存在类似ORACLE临时表事务级别上的功能;
3 SQL SERVER本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,SQL SERVER会自动删除,ORACLE不会删除表;
4 SQL SERVER的全局临时表(##) 是指多个连接共享同一片内存。当没有指针引用该内存区域时,SQL SERVER自动释放全局临时表。
ORACLE不是一种内存中的数据库,所以如果ORACLE类似SQL SERVER 频繁的对临时表进行建立和删除,必定会影响性能。所以ORACLE会保留临时表的定义直到用户DROP TABLE。
在ORACLE中,如果需要多个用户共享一个表(类似
SQL
SERVER的全局临时表##),则可以利用永久表,并且在表中添加一些可以唯一标识用户的列。利用触发器和视图,当用户退出的时候,根据该登陆用户的唯
一信息删除相应的表中的数据。 但这种方法给ORACLE带来了一定量的负载。
三 使用
1 判断表不存在就创建表
<textarea cols="50" rows="15" name="code" class="java:showcolumns:firstline[1]">create ...
is
temptable_name varchar2(20);
v_count number(1);
begin
temptable_name := 'TEMP_TABLENAME';
select count(*) into v_count from tab where tname = temptable_name;
if(v_count = 0) then
execute immediate 'create table ...';
else
--其他表存在的操作
end if;</textarea>
2 注意使用时,可能会产生的错误:ORA-08103: object no longer
exists,ORA-14452 attempt to create, alter or drop an index on temporary
table already in use
ORA-14452 : 通过1的判断,一般会解决该问题。如果在表使用时,执行删除表操作,会出现该错误。
ORA-08103 : 使用事务级的临时表时,如果,事务提交前执行删除表操作或者在事务提交以后使用,就会产生这样的问题。改成会话级别的可以解决这个问题,但是在会话级别的数据的正确性,可能会因为使用连接池,同一个会话中不同操作而产生错误。
㈡ oracle中一个用户有多个表空间,那么该用户创建的表会存在哪里呢
在Oracle数据库中,用户可以被赋予多个表空间。创建用户时,可以指定默认表空间,如果不指定,默认表空间为users。例如,执行以下SQL语句可以创建一个用户,并为其指定默认表空间:
create user scott identified by tiger default tablespace test1;
一、如果在创建表时,没有单独指定表空间,那么该表将存储在用户默认的表空间中。例如:
create table t1(id number);
二、如果创建表时,用户明确指定了一个表空间,那么该表将存储在指定的表空间中。例如:
create table t1(id number) tablespace test;
三、对于分区表,每个分区会存储在不同的表空间中。分区表是将大表分割成更小、更易管理的部分,每个部分被称为一个分区。分区表的每个分区可以分配到不同的表空间,这样可以提高查询效率和数据管理的灵活性。例如:
create table sales (year number, month number, amount number) partition by range (year, month) (partition p1 tablespace test1, partition p2 tablespace test2);
以上示例中,销售数据根据年份和月份被分割成两个分区,分区p1存储在表空间test1中,而分区p2则存储在表空间test2中。
需要注意的是,虽然用户可以被赋予多个表空间,但每个表只能存储在一个表空间中。如果需要将表的一部分数据存储在另一个表空间中,可以考虑使用分区表。分区表的灵活性和效率使得它成为管理大规模数据集的强大工具。
此外,表空间的管理对于数据库性能和维护至关重要。选择合适的表空间策略,可以优化数据库性能,提高查询速度,并确保数据的安全和完整性。
㈢ oracle存储过程如何动态修改表名关联查询
在Oracle中动态修改表名并关联查询时,可以利用动态SQL来实现。通过将SQL语句拼接成字符串,并使用EXECUTE IMMEDIATE执行,可以灵活地调整表名,从而适应不同的查询需求。
举个例子,假设需要查询前一天的短信发送数量,可以根据系统日期动态构建SQL语句。具体步骤如下:
首先,获取当前日期减去一天的日期格式化为“dd”形式的字符串。
接着,定义一个字符串变量来存储构建好的SQL语句。SQL语句中包含内连接操作,连接条件为学校ID和发送ID,同时筛选出特定的数据源和错误码。
具体的SQL语句如下:
VSQL varchar2(2000)
day varchar2(2);
begin
day := to_char(sysdate-1,'dd');
VSQL := ' select sum(sms.send_count) into sa_send_cnt from core_school sc inner join sms_mt_send sms on sc.school_id = sms.school_id inner join sms_mt_send_detail_' || day || ' detail on sms.mt_send_id = detail.mt_send_id where sms.data_src in (1,2,3) and (detail.errorcode = ''0'' or detail.errorcode is null) ';
execute immediate VSQL;
end;
在这个例子中,我们使用了动态SQL来构建查询语句,并通过EXECUTE IMMEDIATE执行该语句。这种方式使我们能够根据需要动态地修改表名和添加查询条件,从而提高代码的灵活性和适应性。
值得注意的是,使用动态SQL时需谨慎,确保输入数据的安全性,避免SQL注入等安全风险。
㈣ 用oracle存储过程将一张表的数据查出插入另一张表
1、创建测试表,
create table test_tbl_1(id number, value varchar2(20));
create table test_tbl_2(id number, value varchar2(20));