产生insert 语句

通过输入参数,可以产生condition的insert语句。

适用于不同数据库之间的data migration。

CREATE PROCEDURE SCHEMA.CONVERT_TO_INSERTSQL  (
IN schemaname varchar(40),
IN tablename varchar(40),
IN conditions varchar(400)
)

------------------------------------------------------------------------
-- SQL Stored Procedure
------------------------------------------------------------------------

DYNAMIC RESULT SETS 1

P1: BEGIN
declare body varchar(4000);
declare head varchar(4000);
declare columnname varchar(100);
declare bodycolumnname varchar(100);
declare numbercolumnname varchar(100);
declare datatype varchar(50);
declare count int;
declare i int;
DECLARE presql varchar(5000);

DECLARE cursor1 CURSOR WITH RETURN FOR --define cursor using for select columns
SELECT NAME,COLTYPE FROM SYSIBM.SYSCOLUMNS WHERE TBNAME=tablename AND TBCREATOR=schemaname;

DECLARE cursor2 CURSOR WITH RETURN FOR sqlselect; --define dynamic using for results


open cursor1;
set body = '';
set head = '''insert into '||schemaname||'.'||tablename||'(' ;
set count = (SELECT COUNT(*) FROM SYSIBM.SYSCOLUMNS WHERE TBNAME=tablename AND TBCREATOR=schemaname);
set i = 0;
WHILE i <count DO
fetch cursor1 into columnname,datatype;
set bodycolumnname = 'coalesce(rtrim('||columnname||'),'''')';
set numbercolumnname = 'char('||columnname||')';
case datatype
when 'VARCHAR' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'''''''''||'||'||bodycolumnname||'||'||'''''''''||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'''''''''||'||'||bodycolumnname||'||'||'''''''''||'||''');''' ;
end if;

when 'CHAR' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'''''''''||'||'||bodycolumnname||'||'||'''''''''||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'''''''''||'||'||bodycolumnname||'||'||'''''''''||'||''');''' ;
end if;

when 'LONGVAR' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'''''''''||'||'||bodycolumnname||'||'||'''''''''||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'''''''''||'||'||bodycolumnname||'||'||'''''''''||'||''');''' ;
end if;

when 'BIGINT' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'||numbercolumnname||'||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'||numbercolumnname||'||'||''');''' ;
end if;

when 'DECIMAL' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'||numbercolumnname||'||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'||numbercolumnname||'||'||''');''' ;
end if;

when 'DOUBLE' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'||numbercolumnname||'||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'||numbercolumnname||'||'||''');''' ;
end if;

when 'INTEGER' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'||numbercolumnname||'||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'||numbercolumnname||'||'||''');''' ;
end if;

when 'SMALLINT' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'||numbercolumnname||'||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'||numbercolumnname||'||'||''');''' ;
end if;

when 'TIMESTMP' then
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'||''''||'CURRENT TIMESTAMP'||''''||'||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'||''''||'CURRENT TIMESTAMP'||''''||'||'||''');''' ;

end if;
else
if i<count - 1 then
set head = head||columnname||',' ;
set body = body||'||'''''''''||'||'||'''''''''||'||''',''' ;
else
set head = head||columnname||') values(''' ;
set body = body||'||'''''''''||'||'||'''''''''||'||''');''' ;
end if;

end case ;
set i = i+1;
end while;
close cursor1;
set presql='select '||head||body|| ' from '||schemaname||'.'||tablename||' where '||conditions;

prepare sqlselect from presql;

open cursor2 ;

END P1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值