如何从文件中读取输入并在 sqlplus 查询中使用它?

Posted

技术标签:

【中文标题】如何从文件中读取输入并在 sqlplus 查询中使用它?【英文标题】:How to I read input from a file and use it in an sqlplus query? 【发布时间】:2014-08-18 12:35:11 【问题描述】:

我正在尝试类似的东西

   select customer_id, order_id from order_table where purchase_id = 10 OR 
   purchase_id = 25 OR 
   ...
   purchase_id = 25432;

由于查询太大,我遇到了各种各样的问题......如果我在一行中运行整个查询,我会遇到错误:

SP2-0027: Input is too long (> 2499 characters) - line ignored

如果将查询拆分为多行,由于与为输入查询的每一行打印的行号的干扰,查询会被破坏。如果我禁用行号,每行的 SQL> 提示都会困扰我。

如果从文本文件 SQL> @query.sql 运行查询,则会出现同样的错误 (我以前用mysql没遇到过这样的问题,现在用sqlplus)。

我不是 shell 脚本专家,也不是 python 专家。如果我能获得有关如何将所有 purchase_ids 放入文本文件中的指针,每行一个 purchase_id 并将其提供给脚本运行时的 sqlplus 查询,那将是非常有帮助的。

我做了充分的研究,但我仍然很感激指点。

【问题讨论】:

您是否尝试过使用 IN 子句来缩短查询:select customer_id, order_id from order_table where purchase_id IN (10,25,2542); In 似乎是 IN() 与@AnthonyKong 的 2a) 结合似乎是不错的选择。目前正在研究一个shellscript,在一个for循环中我正在连接到数据库。每个连接大约需要 15 秒,因此结果可能需要几个小时。 【参考方案1】:

1) 语法变化

尝试使用 'in (10,25,2542, ...)' 而不是一系列的 'OR'。可以减少sql语句的大小

2) 逻辑变化

语法可能会延迟不可避免,但如果有很多 id 要排除,异常仍然会发生。

2a)

一个直截了当的解决方法是将查询分成多个批次。您可以针对每 50 个购买 ID 发出一次选择查询,直到覆盖所有 ID。

2b)

或者您可以研究一种更通用的方法来检索相同的查询结果。假设您真正想看到的是“未确认订单”列表。然后,您可以在 order_table 中添加一个布尔字段“已确认”,而不是在 where 子句中使用一组购买 ID,并根据此条件进行选择。

【讨论】:

您是否考虑过所需的后期处理成本(在我看来这太高了)和数据准确性(值得怀疑)?【参考方案2】:

另一个想法:

创建一个表“query_ids”(一列)并从WHERE 子句中输入您所有的order_id

新的查询是:

select customer_id, order_id from order_table where purchase_id = ( select * from query_ids);

【讨论】:

好主意。但我无权创建新表。其次,我将不得不以某种方式将 purchase_ids 转移到新表中。回到原点。但是,如果我重复(至少两次)基于新表运行查询,这似乎非常有用。

以上是关于如何从文件中读取输入并在 sqlplus 查询中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。

如何使用 SqlPlus 查询的输出提示用户进行更多输入 [重复]

如何在python中读取sql查询输出

我如何从 sqlplus 查询中“清理”输出?

如何加载程序读取标准输入并在 gdb 中获取参数?

如何使用 HTML 输入文件导入 excel 文件并在 Node.js 中读取文件内容(如何将完整路径发送到 Node.js)