DB2创建伪表存储过程

调用示例
call BSDCMACW.P_CREATE_TEMP_TABLE('BSDCMACW','test12','01','select * from bsdcmacw.T_ADS_FACT_CWMO_0010');

创建伪表
SET CURRENT SCHEMA = "bsdcmacw";

SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,SYSIBMADM,BSDCMACW;

CREATE OR REPLACE PROCEDURE BSDCMACW.P_CREATE_TEMP_TABLE (
    IN P_OWNER	VARCHAR(32),
    IN P_TAB_NAME	VARCHAR(32),
    IN P_SEQ_NO	VARCHAR(32),
    IN P_QUERY_STR	CLOB(1M) )
  SPECIFIC P_CREATE_TEMP_TABLE
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  CALLED ON NULL INPUT
  INHERIT SPECIAL REGISTERS
  OLD SAVEPOINT LEVEL
/*声明为自治事务*/
--AUTONOMOUS
BEGIN
/*
| Procedure name: p_create_temp_table
|
| Overview: 创建临时表
|
| Author(s): 李军
|
| Modification History:
|   Date        Who           What
|   2013.01    李军          Created
*/
DECLARE SQLCODE INTEGER;
DECLARE SQLSTATE, v_sqlstate CHAR(5);
DECLARE MESSAGE_TEXT VARCHAR(2048);
DECLARE v_sql_str CLOB(1M);
DECLARE v_tab_name, v_full_name, v_tmp_name VARCHAR(128);
DECLARE v_num INT;
DECLARE v_cur CURSOR FOR STMT;
 
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
--捕获出错信息
GET DIAGNOSTICS EXCEPTION 1 MESSAGE_TEXT = MESSAGE_TEXT;
SELECT SQLSTATE INTO v_sqlstate FROM sysibm.dual;
--中间临时表如果存在,则删除
SET v_sql_str = '
SELECT COUNT(*)
FROM syscat.tables t
WHERE t.tabschema = UPPER(''' || p_owner || ''')
AND t.tabname = UPPER(''' || v_tab_name || '_MRN'')
';
--CALL p_exec_into(v_sql_str, v_num);
 
PREPARE STMT FROM v_sql_str;
OPEN v_cur;
FETCH v_cur INTO v_num;
CLOSE v_cur;

IF v_num > 0 THEN
SET v_sql_str = '
DROP TABLE ' || v_tmp_name
;
EXECUTE IMMEDIATE v_sql_str;
COMMIT;
END IF;
--抛出出错信息
SIGNAL SQLSTATE v_sqlstate SET MESSAGE_TEXT = MESSAGE_TEXT;
END;
 
--1. 创建临时表
SET v_tab_name = p_tab_name || '_' || p_seq_no;
SET v_full_name = p_owner || '.' || v_tab_name;
SET v_tmp_name = v_full_name || '_MRN';
SET v_sql_str = 'CREATE TABLE ' || v_tmp_name
|| ' AS (' || p_query_str || ') DEFINITION ONLY IN BSDCMACW'
;
EXECUTE IMMEDIATE v_sql_str;
COMMIT;
 
--2. 插入数据
SET v_sql_str = 'INSERT INTO ' || v_tmp_name || ' '
|| p_query_str
;
EXECUTE IMMEDIATE v_sql_str;
COMMIT;
 
--3. 更改表名
--3.1 若目标临时表与其建表语句中表同名则删除源表
SET v_sql_str = '
SELECT COUNT(*) 
FROM syscat.tables t
WHERE t.tabschema = UPPER(''' || p_owner || ''')
AND t.tabname = UPPER(''' || v_tab_name || ''')
';
--CALL p_exec_into(v_sql_str, v_num);
PREPARE STMT FROM v_sql_str;
OPEN v_cur;
FETCH v_cur INTO v_num;
CLOSE v_cur;

IF v_num > 0 THEN
SET v_sql_str = '
DROP TABLE ' || v_full_name
;
EXECUTE IMMEDIATE v_sql_str;
COMMIT;
END IF;
--3.2 更改表名
SET v_sql_str = 'RENAME TABLE ' || v_tmp_name || ' TO ' || v_tab_name
;
EXECUTE IMMEDIATE v_sql_str;
COMMIT;
 
 
END;

SET CURRENT SCHEMA = BSDCMACW;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛小方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值