ETL函数编程技巧

Bonnie ·
更新时间:2024-09-21
· 683 次阅读

致力做一个首先想的是怎么帮助别人的人
点赞再看,谢谢支持

前言

在数据处理的过程中,总是避免不了创建临时表来记录一些中间数据,所以每次都要先建表,在维护阶段还经常要增加字段,一度让我非常抓狂,本文为你提供了一个方法,能够提高你的编程效率,降低维护的工作量。

旧方法

为了存储中间结果,创建一个临时表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语句即可,便于后期维护
缺点:可忽略

希望对你有帮助,点个赞再走呗


作者:数据可以说话



etl 技巧 编程技巧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号