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

0 投票
2 回答
686 浏览
提问于 2025-04-18 17:39

我正在尝试做一些事情,代码如下:

   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_id放到一个文本文件里,每个purchase_id占一行,然后在脚本运行时把它提供给sqlplus查询,那就太好了。

我做了足够的研究,但我仍然很感激任何建议。

2 个回答

1

另一个想法:

创建一个名为 "query_ids" 的表(只有一列),把你在 WHERE 条件中用到的所有 order_id 都放进去。

新的查询语句可以写成:

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

1

1) 语法改变

试着用'in (10,25,2542, ...)'来代替一堆'OR'。这样可以让你的sql语句变得更简洁。

2) 逻辑改变

虽然语法的改变可能会暂时解决问题,但如果需要排除的id很多,错误还是会出现。

2a)

一个简单的解决办法是把查询分成几个小批次。你可以每次查询50个购买ID,直到所有的ID都处理完。

2b)

或者你可以考虑一种更通用的方法来获取相同的查询结果。假设你其实想要看到的是一个“未确认订单”的列表。那么与其在条件中使用一堆购买ID,不如在order_table中添加一个布尔字段'confirmed',然后根据这个条件来选择数据。

撰写回答