gpt4 book ai didi

sql - 在大型插入语句中使用绑定(bind)变量

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:19 26 4
gpt4 key购买 nike

我继承了一个应用程序,该应用程序必须从各种类型的文件中读取数据并使用 OCI 接口(interface)将数据移动到 Oracle 数据库中。大多数有问题的表都有大约 40-50 列,因此 SQL 插入语句变得非常冗长。

当我继承这段代码时,它基本上通过一系列 strcat 将插入语句构建为 C 字符串,然后将其传递给适当的 OCI 函数以设置和执行语句。然而,由于大部分数据是直接从文件中读取到列值中的,这使得应用程序容易受到 SQL 注入(inject)的影响。所以我试图使用绑定(bind)变量来解决这个问题。

在我能找到的每个 OCI 应用程序示例中,每个变量都是单独静态分配和绑定(bind)的。然而,这会导致相当多的样板文件,我想将其减少为某种循环结构。所以我的解决方案是,为每个表创建一个包含表列名称的静态字符串数组:

const char const *TABLE_NAME[N_COLS] = {
"COL_1",
"COL_2",
"COL_3",
...
"COL_N"
};

连同一个用列名作为占位符的短函数:

void makePlaceholder(char *buf, const char *col);
// "COLUMN_NAME" -> ":column_name"

然后我遍历每个数组并将我的值绑定(bind)到每一列,同时生成占位符。这里的一个潜在问题是,由于每一列的类型不同,我将所有内容都绑定(bind)为 SQLT_STR(字符串),因此期望 Oracle 在插入时转换为正确的数据类型。

所以,我的问题是:

  1. 将绑定(bind)变量用于具有大量列/参数的 SQL 插入语句的正确/惯用语(如果 SQL/OCI 存在这样的事情)是什么?更一般地说,使用 OCI 制作这种大型插入语句的最佳方法是什么?

  2. 与构建和使用 vanilla C 字符串相比,大量绑定(bind)调用是否会显着降低效率?

  3. 将所有变量绑定(bind)为字符串并允许 Oracle 进行正确的类型转换是否存在任何风险?

提前致谢!

最佳答案

不确定这方面的 C 方面。我的回答将从 DBA 的角度出发。

问题二:始终使用绑定(bind)变量。它可以防止 SQL 注入(inject)并提高性能。

性能方面经常被程序员忽视。当 Oracle 收到一条 SQL 时,它会对整个 SQL 文本进行哈希处理,并在其内部执行计划存储库中查看是否有执行计划。如果使用绑定(bind)变量,则每次运行查询时 SQL 文本都是相同的,而不管变量的值是什么。但是,如果您连接了字符串,您自己的 Oracle 将散列 SQL 文本,包括(您应该输入的内容)变量的内容,每次都获得一个唯一的散列。因此,如果您执行一百万次查询,如果您使用绑定(bind)变量,Oracle 将制定一个执行计划,而如果您不使用绑定(bind)变量,它将制定一百万次执行计划并浪费大量资源。

关于sql - 在大型插入语句中使用绑定(bind)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24716496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com