致力做一个首先想的是怎么帮助别人的人
点赞再看,谢谢支持
在数据处理的过程中,总是避免不了创建临时表来记录一些中间数据,所以每次都要先建表,在维护阶段还经常要增加字段,一度让我非常抓狂,本文为你提供了一个方法,能够提高你的编程效率,降低维护的工作量。
旧方法为了存储中间结果,创建一个临时表T_TEMP:
CREATE TABLE T_TEMP (COL1 VARCHAR2(10),COL2 VARCHAR2(10));
然后往表中插入数据:
INSERT INTO T_TEMP(COL1,COL2)
SELECT COL1,COL2
FROM T;
COMMIT;
优点:逻辑明显,可以直接判断具体哪里出错
缺点:每次要更改逻辑,增加字段的时候,必须手工更改临时表T_TEMP的表结构,修改insert语句,而大家知道,甲方爸爸是摸不准的,随时可能变更需求,重复的修改让人崩溃。
创建一个存储过程,根据sql结果来生成临时表数据。
存储过程需要两个传入参数:
1、临时表名
2、执行sql(生成临时表数据的sql)
存储过程具体步骤:
1、判断表名是否违反规则,如只接受TMP_开头的表名
2、判断当前数据库用户下是否已存在同名表
3、如果存在同名表,则先删除表再创建
具体实现代码如下:
create or replace procedure p_create_tmp_table_bro(a_select_sql varchar2,
a_table varchar2) is
v_sql varchar2(30000);
v_theCount number;
/*
--模块功能:根据结果集生成数据表,等同SQL Server的[select into表]功能
*/
begin
if not((upper(substr(a_table, 0, 4)) = 'TMP_')) then
raise_application_error(-20001,
'违反命名规则:系统只接受以tmp_开头命名的数据表');
end if;
select count(1)
into v_theCount
from user_tables
where table_name = upper(a_table);
if (v_theCount > 0) then
--先drop,后create
v_sql := f_drop_table(a_table);
execute immediate v_sql;
end if;
--直接create
v_sql := 'CREATE TABLE ' || a_table || ' NOLOGGING AS ' || a_select_sql;
execute immediate v_sql;
end;
存储过程使用方法:
v_sql varchar2(4000);
v_tmp_table_name varchar2(100);
v_sql := 'SELECT COL1,COL2 FROM T';
v_tmp_table_name := 'tmp_t';
p_create_tmp_table_bro(v_sql,v_tmp_table_name);
优点:当临时表结构需要变更的时候,不需要手工修改表结构,只需更改传入的sql语句即可,便于后期维护
缺点:可忽略
希望对你有帮助,点个赞再走呗