通过输入参数,可以产生condition的insert语句。
适用于不同数据库之间的data migration。
适用于不同数据库之间的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