通过输入参数,可以产生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
分享到:
相关推荐
将ms-sql-server 指定的表数据,自动转换成相应的insert sql 语句,做数据迁移是比较方便. 说明: 1、3级执行,即将执行的结果再执行/再执行得到所要的 SQL语句; 2、不限表字段多少限制,网络上有个类似的...
的行产生 Insert 语句,为状态是 DataModified! 的行产生 Update 语句,只有状态是 DataModified! 的列才会包含在 Update 语句中。对删除缓冲区中的行,若其状态是 New! 或 NewModified!,则 Update 语句不会为其...
以下是关于DML语句对索引影响的详细解释,以INSERT语句为例进行阐述。 1. INSERT语句对索引的影响: 当我们执行INSERT语句向表中插入新的记录时,与记录关联的索引也需要更新。在上述示例中,创建了一个名为`text...
然而,正如标题和描述所指出的,使用`INSERT EXEC`可能存在一些隐藏的开销,这些开销可能在性能上产生影响。以下是对这些隐藏成本的详细分析: 首先,我们要明确两种基本的`INSERT EXEC`形式: 1. **EXEC('INSERT....
MySQL 的 SQL 语句大小写不敏感问题解决方案 MySQL 的 SQL 语句大小写不敏感问题是一个普遍存在的问题,特别是在 Linux 和 Windows 两种操作系统下。这个问题的产生是由于 MySQL 在不同的操作系统下对大小写的处理...
总之,INSERT语句的undo log是数据库管理系统为了确保事务的正确性和数据一致性而产生的关键记录。通过理解并有效地利用undo log,我们可以更好地管理和维护数据库,提升系统稳定性和性能。在分析undo log时,不仅要...
- **两表联合查询**:当两个表进行联接时,如果没有添加任何条件限制,则会产生所有可能的组合,这种查询称为卡迪尔积,结果集通常没有实际意义。 - **内连接**:只返回两个表中匹配的行。 - 示例:`SELECT e.id, d...
执行语句如下: sql_str = INSERT INTO teacher(t_name, t_info, t_phone, t_email) VALUES\ (\'%s\', \'%s\', \'%s\', \'%s\') % (result, result2, phoneNumber, Email) cur.execute(sql_str) 执行程序后,产生...
在Mybatis中,如果需要在插入数据时自动生成主键,可以在insert语句中指定keyProperty属性,将其绑定到对应的实体类属性上。然后在插入操作之后,可以通过返回的GeneratedKeys来获取自动生成的主键值。 ### 实例...
- `@@ERROR`:获取最后一次执行的语句产生的错误号。 - `@@IDENTITY`:获取最近插入的标识列的值。 - **局部变量**:由用户定义,在同一批处理中使用。 - `DECLARE @variable_name 数据类型;`:声明局部变量。 -...
--complete-insert 选项可以使 mysqldump 命令给每个产生的 INSERT 语句加上列(field)的名字,以便在将数据导出到另一个数据库时使用。 --delayed-insert 选项可以在 INSERT 命令中加入 DELAY 选项,以便在导入...
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 add...
SQL语句的基本语法包括以下关键字:SELECT, INSERT INTO, UPDATE, DELETE, FROM, WHERE, AND, OR, ORDER BY, JOIN, UNION等。这些关键字用于执行不同类型的数据操作。 - SELECT用于从数据库中检索数据。 - INSERT ...
INSERT INTO UFDATA_007_2011..GL_accvouch ( ... ) SELECT 0 AS i_period, csign, isignseq, ino_id, inid, dbill_date, idoc, cbill, ... ``` 接下来,该脚本将符合条件的数据插入到新的会计年度对应的`GL_...
对于小规模数据导入,可以直接在PLSQL Developer中使用INSERT语句。批量插入可以使用INSERT ALL语句,一次写入多行数据,如: ```sql INSERT ALL INTO table1 VALUES (value1, value2) INTO table2 VALUES (value...
这个类名为`ServerBase`,它包含三个静态方法:`BuildinsertSql`用于生成插入(INSERT)语句,`BuiltUpdateSql`用于生成更新(UPDATE)语句,虽然没有给出删除(DELETE)语句的代码,但可以推断其原理类似。...
- 它的主要方法包括`append()`、`insert()`、`delete()`、`replace()`等,用于添加、插入、删除或替换字符串内容。 - 通常在单线程环境中,`StringBuilder`比`StringBuffer`更快,因为它省去了线程同步的开销。 2...
1. **executeQuery**:用于执行产生单个结果集的SQL语句,如`SELECT`语句。此方法返回一个`ResultSet`对象,其中包含了查询的结果。 ```java ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); ...
传统的做法是逐条执行INSERT语句,而优化后的做法是将多条数据合并到一个单独的INSERT语句中,如下面所示: ```sql INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', ...