如何在 Delphi 的 SimpleDataSet 中使用 Oracle 绑定变量?

Posted

技术标签:

【中文标题】如何在 Delphi 的 SimpleDataSet 中使用 Oracle 绑定变量?【英文标题】:How can I utilize Oracle bind variables with Delphi's SimpleDataSet? 【发布时间】:2012-02-27 19:38:54 【问题描述】:

我有一个 Oracle 9 数据库,我的 Delphi 2006 应用程序使用类似这样的 SQL 语句将数据读取到 TSimpleDataSet(实际上它当然更复杂):

select * from myschema.mytable where ID in (1, 2, 4)

我的应用程序在一天中经常启动并执行此查询,每次在 in 子句中使用不同的值。

我的 DBA 通知我,这会在数据库服务器上造成过多的负载,因为每次运行都会重新解析查询。他们建议使用bind variables,而不是在客户端构建SQL语句。

我熟悉在 Delphi 中使用参数化查询,但从上面链接的文章中,我感觉绑定变量并不完全是什么。此外,我需要这些准备好的语句才能在应用程序的不同运行中工作。

有没有办法在数据库中准备一个包含in 子句的语句,然后使用从TSimpleDataSet 传入的不同参数执行它,这样每次我的应用程序运行时都不需要重新解析它跑吗?

【问题讨论】:

你确定你真的需要使用 TSimpleDataSet 或 dbExpress 吗?看来如果性能很重要,也许您应该切换到纯 Oracle 数据库组件并放弃 dbExpress 和 TSimpleDataSet? @WarrenP 如果可能的话,我想留在 dbExpress,因为我围绕它构建了一大堆其他组件。不过,出于好奇,您想到了哪些仅适用于 Oracle 的原生数据库组件? 商业和高性能:devart.com/odac 商业,我强烈推荐Direct Oracle Access。 【参考方案1】:

我的回答与Delphi没有直接关系,但一般来说这个问题。您的问题是可变大小的列表中的问题。 Tom Kyte of Oracle 有一些您可以使用的建议。本质上,您正在创建太多独特的查询,导致数据库进行大量的硬解析。这将不必要地增加 CPU 消耗(和 DBA 血压)。

通过使您的查询静态化,它可以通过软解析或根本不解析来解决!然后DB可以缓存执行计划,DBA可以处理更“稳定”的SQL,整体性能应该会提高。

【讨论】:

以上是关于如何在 Delphi 的 SimpleDataSet 中使用 Oracle 绑定变量?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中如何在dbgrid中主动添加序号?求赞助!

请问如何在delphi from窗体内加网页

delphi 如何在Delphi中执行将Excel表格里的内容导入数据库中相应表

如何在delphi中构建类?

在delphi中如何获取字符串的内存地址

delphi中如何使用SQL语句结果