【问题标题】:Comparing SQL statements from the file with the SQL statements stored in a database将文件中的 SQL 语句与存储在数据库中的 SQL 语句进行比较
【发布时间】:2017-01-26 05:26:55
【问题描述】:

我正在从一个 SQL 文件中解析语句(基于分号),通过DBI 执行它们,并将执行成功的语句以“成功”状态存储到 Oracle 数据库中。

如果由于语法错误而在执行 SQL 文件的过程中出现错误,我将停止我的 Perl 脚本并纠正错误。当我重新启动 Perl 脚本时,我需要将文件中的语句与数据库中标记为成功的语句进行比较。

如果一个语句已经在数据库中,我不会再执行它;我会跳过它。但如果它不存在,那么我将从上次失败的那个语句开始执行。

比较它们的最佳方法是什么?我试图获取存储在数据库中的语句,但我无法获取整个语句。

如何将大 SQL 语句转换为字符串并将它们存储在数据库中,以便使用 eq 运算符进行比较?

【问题讨论】:

  • 为什么不直接解析文件,将语句排入队列,然后处理队列呢?文件解析完成后无需再参考。
  • 您的方法本身就有缺陷。手动编辑文件会使 所有 语句容易受到修改,包括那些已经执行的语句。这意味着您的记录可能不再与文件的内容匹配,您的进度记录一文不值。此外,“我试图获取存储在数据库中的语句,但我无法获取整个语句” 表示您有一个需要修复的错误。是不是你的数据库字段不够大?
  • @MattJacob:“将语句排入队列” 是什么意思? DBI 本身没有排队机制。
  • @Borodin 他已经将运行后状态为success 的语句插入到数据库中。我建议分离解析和处理组件,并让解析器将语句插入到表(队列)中,status 表明它们需要运行。每次启动时,处理器都会查找需要运行的语句并运行它们。
  • @Borodin:我给出了 long 数据类型,我可以看到整个语句被插入到数据库中。但是在取回它并将其存储在 perl 变量中时,我没有得到将整个语句放入 perl 变量中。sql 语句中的新行、制表符或空格是否会影响任何无法取回整个语句的内容?

标签: sql perl oracle11g


【解决方案1】:

我建议这样的东西

  • 读取文件并将其拆分为分号

  • prepare文件中的每个语句,并将语句推送到数组中

  • 如果任何语句解析失败,则报告并放弃处理

  • 开始交易

  • execute每个语句依次从数组中

  • 如果任何语句执行失败,则报告它,回滚事务,并放弃处理

  • 提交事务并终止

【讨论】:

  • 感谢 Borodin。您的解决方案似乎是最好的解决方案。我会尝试的。
  • :但是这个回滚不会也回滚我的 DDL 语句对吗?它只能用于 DML 语句。除此之外,您的解决方案是完美的,最适合我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多