正则替换sql为动态sql

版本一:

  1. #coding:utf-8
  2. import re
  3. #把文档中的单引号替换为2个单引号
  4. def replacestr(matched):
  5. matchedstr = matched.group()
  6. x = matchedstr.replace("‘", "‘‘")
  7. return x
  8. def main():
  9. f_sql = open(‘fzt_dd.sql‘, ‘r‘)
  10. sql = f_sql.read()
  11. f_sql.close()
  12. for a, b, c in patterns:
  13. sql = re.sub(a, b, sql, flags=c) #flags是匹配模式
  14. f_sql = open(‘2.sql‘,‘w‘)
  15. f_sql.write(sql)
  16. f_sql.close()
  17. patterns = \
  18. (
  19. (r"\bdelete\b", r"execute immediate ‘delete", re.I), #替换delete等
  20. (r"\bupdate\b", r"execute immediate ‘update", re.I),
  21. (r"\binsert\b", r"execute immediate ‘insert", re.I),
  22. (r"\balter\b", r"execute immediate ‘alter", re.I),
  23. (r"\bcreate\b", r"execute immediate ‘create", re.I),
  24. (r"\bdrop\s+TABLE\s+(\w+)\s*;", r"drop_table(‘\1‘);", re.I), #替换drop table为drop_table函数
  25. (r"execute immediate(.*?);", r"execute immediate\1‘;", re.S), #在execute imediate尾加单引号
  26. (r"(?<=execute immediate ‘).*?(?=‘;)", replacestr, re.S) #把内容中的单引号替换为2个单引号
  27. )
  28. if __name__ == ‘__main__‘:
  29. main()

版本二:

  1. #coding:utf-8
  2. import re
  3. f_sql = open(‘1.sql‘, ‘r‘)
  4. sql = f_sql.read()
  5. f_sql.close()
  6. drop_str = re.compile(r‘\bdrop\s+TABLE\s+(\w+)\s*;‘, re.I)
  7. start_str = re.compile(r‘\bcreate\b‘, re.I)
  8. end_str = re.compile(r‘execute immediate(.*?);‘, re.S)
  9. content_str = re.compile(r"(?<=execute immediate ‘).*?(?=‘;)", re.S)
  10. #替换以下开头的语句为execute immediate开始
  11. start_list = [‘delete‘, ‘update‘, ‘insert‘, ‘alter‘, ‘create‘]
  12. start_pattern = []
  13. for i in start_list:
  14. pa_str = r‘\b%s\b‘ % i
  15. result_str = r"execute immediate ‘%s " %i
  16. pa = re.compile(pa_str, re.I)
  17. sql = pa.sub(result_str, sql)
  18. #用drop_table函数替换drop语句
  19. sql = drop_str.sub(r"drop_table(‘\1‘);", sql)
  20. #在execute immediate语句结尾加单引号
  21. sql = end_str.sub(r"execute immediate\1‘;", sql)
  22. #把文档中的单引号替换为2个单引号
  23. def _replacestr(matched):
  24. matchedstr = matched.group()
  25. x = matchedstr.replace("‘", "‘‘")
  26. return x
  27. #用函数替换内容中的单引号为2个单引号
  28. sql = content_str.sub(_replacestr, sql)
  29. f_sql = open(‘2.sql‘,‘w‘)
  30. f_sql.write(sql)
  31. f_sql.close()

版本三:

  1. import re
  2. sql = ‘‘‘DROP TABLE FZT_OL_NBR;
  3. execute immediate ‘CREATE TABLE FZT_OL_NBR as
  4. SELECT OL_NBR FROM [email protected] A WHERE A.CO_ID IN (SEL‘ECT B‘.CO_ID FROM FZT_CUST_ORDER B );
  5. DROP TABLE FZT_OL_NBR;
  6. execute immediate ‘CREATE TABLE FZT_OL_NBR as
  7. SELECT OL_NBR FROM [email protected] A WHERE A.CO_ID IN (SEL‘ECT B‘.CO_ID FROM FZT_CUST_ORDER B );‘‘‘
  8. a = re.compile(r‘drop\s+TABLE\s+(\w+)\s*;‘, re.I)
  9. b = re.compile(r‘create\s+‘,re.I)
  10. b1 = re.compile(r‘execute immediate(.*?)(;)‘, re.S)
  11. p = re.compile(r"(?<=execute immediate ‘).*?(?=;)", re.S)
  12. def _replacestr(matched):
  13. matchedstr = matched.group()
  14. x = matchedstr.replace("‘", "‘‘")
  15. return x
  16. c = a.sub(r"drop_table(‘\1‘);", sql)
  17. d = b.sub(r"execute immediate ‘ create ", sql)
  18. e = b1.sub(r"execute immediate\1‘;", sql)
  19. f = p.sub(_replacestr, sql)
  20. print f

来自为知笔记(Wiz)

时间: 2024-10-11 16:46:42

正则替换sql为动态sql的相关文章

动态SQL是什么??什么是静态SQL,动态SQL的动态体现在哪里???

首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程.在某种高级语言中,如果嵌入了SQL语句,而这个SQL语句的主体结构已经明确,例如在Java的一段代码中有一个待执行的SQL"select * from t1 where c1>5",在Java编译阶段,就可以将这段SQL交给数据库管理系统去分析,数据库软件可以对这段SQL进行语法解析,生成数据库方面

(转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) declare @i_counts int, @i_times int; set @str_sql = 'select @tmp_counts = counts, @tmp_times=times ' + ' from ' +@str_dbname+ '.dbo.t_msisdn with(nolock) '

MyBatis动态SQL————MyBatis动态SQL标签的用法

1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

学习笔记-静态SQL和动态SQL

一:静态SQL 在编写pl/sql程序的时候,sql语句已经编写好了(编译时确定) ddl和会话控制语句不能在pl/sql中直接使用 二:动态SQL 在编写pl/sql程序的时候,sql语句还不确定 不编译,执行时动态确定 需要根据用户输入参数动态确定SQL语句 解决pl/sql中不支持ddl语句的问题 动态SQL语法: EXECUTE  IMMEDIATE  ‘DDL,DML语句’  ---sql语句是字符串的形式,sql语句中若有参数,可以:参数名使用 [INTO 〈变量序列〉]      

Oracle_PL/SQL(8) 动态sql

动态sql0.pl/sql块的限制 不能执行ddl操作(create.drop.alter): 不能执行部分dcl操作(grant.revoke). 1.语法动态sql:在执行时才能确定要执行的sql语句.在pl/sql块中编写动态sql语句时,需要将sql语句存放到字符串变量中,而且sql可以包含占位符.execute immediate dynamic_stringdynamic_string :是存放要被执行的sql语句的字符串变量. 2.用途可处理: ddl语句(create,alter

动态SQL语句:定义(一)

文章系列 动态SQL语句:定义(一) 静态SQL与动态SQL 静态SQL:程序运行前,具有固定的形式和结构的SQL. 动态SQL:程序运行时,能够动态改变形式或结构的SQL. 一些思考和想法 在实际的项目中,很多时候无法简单地用一条静态的SQL语句实现复杂的业务逻辑,往往需要通过程序语言动态地生成SQL语句.然而,在代码中通过条件判断语句拼接产生SQL语句,存在诸多缺点,简单列举如下: 代码杂乱和重复,编码的工作量大,而且容易产生错误. 拼接SQL语句的过程中,容易引起SQL注入. 代码与SQL

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包

Oracle基础 动态SQL语句

一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL中的DML和事务控制语句,但是DDL语句,以及会话控制语句却不能再PL/SQL中直接使用,如动态创建表或者某个不确定的操作时,这就需要动态SQL来实现. 2.动态SQL 动态SQL是指在PL/SQL编译时SQL语句是不确定的,如根据用户输入的参数的不同来执行不同的操作.编译程序对动态语句部分不进行处

理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最初关注点中:为什么语句在应用程序中慢,但是在SSMS中快?到目前为止,都是在说存储过程的情况.而存储过程的问题通常是因为SET ARITHABORT的不同设置项的原因.如果你的应用不使用存储过程,而是通过中间层提交客户端的查询,那么也有几个原因可能让你的查询因为不同的缓存条目从而使得在SSMS和应用程序中的运