外壳脚本
#! /bin/bash
sqlplus -s <username>/<passwd>@dbname << EOF
set echo on
set pagesize 0
set verify off
set lines 32000
set trimspool on
set feedback off
SELECT *
FROM <dbname>.<tablename1> tr
LEFT JOIN <tablename2> t2 ON t2.id2 = tr.id1
LEFT JOIN <tablename3> t3 ON t3.id2 = tr.id1
LEFT JOIN <tablename4> t4 ON t4.id2 = tr.id1
WHERE tr.TIMESTAMP > SYSDATE - 75 / 1440
AND tr.TIMESTAMP <= SYSDATE - 15 / 1440
AND t2.value in ( value1, value2, etc...)
ORDER BY timestamp;
exit;
EOF
现在,目的是读取 t2.value 列中的 32000 个值。这些值只是像 1234,4567,1236 等数字。我想我应该将这些数字放在一个单独的文件中,然后在 t2.value 中读取该文件。但我希望 SQL 只执行一次而不是 32000 次。你能告诉我这怎么可能吗?我如何获取 t2.value 中的值(用逗号分隔)(通过某个循环,可能读取行)?
您可以使用 SQL*Loader 将这些值加载到您第一次创建的临时表中,并在其唯一列上建立索引。
sqlldr user/password%@sid control=ctl_file
内容ctl_file
:
load data
infile *
append
into table MY_TEMP_TABLE
fields terminated by ";" optionally enclosed by '"'
(
column1
)
begindata
"value1"
"value2"
[...]
(双引号是可选的,对于数字来说不需要。
然后修改您的查询:
AND t2 in (SELECT column1 FROM my_temp_table)
and DROP my_temp_table
然后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)