使用文本文件,其中每一行都是要传递给 SQL*Plus 的参数
Posted
技术标签:
【中文标题】使用文本文件,其中每一行都是要传递给 SQL*Plus 的参数【英文标题】:Use a text file where each line is a parameter to pass to SQL*Plus 【发布时间】:2018-05-02 10:23:26 【问题描述】:我有一个文本文件,其中每一行都是一个 id。看起来是这样的
008700200107044314929
0049RXPRISE9000000476
0049GMLCLT00000001021
0147RXPRISE0000094208
0111RXPRISE0000043962
0132GDLCLT00000001637
002120001126002858830
0148FI000000000153554
0021JT000000000536614
我想使用该文件并将每一行作为参数传递给我的批处理文件中的 SQL*PLUS。
我想做这样的事情:
sqlplus -l -s %cfg.pivot.user%/%cfg.pivot.pass%@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=%cfg.pivot.server%)(Port=1521))(CONNECT_DATA=(SID=%cfg.pivot.base%))) @%sql_histo% "%list_id_cli_temp%" >> %logfile%
%list_id_cli_temp% 是我的文本文件,%sql_histo% 是我的 SQL 命令,是这样的
insert into xyz.clt_reinsert_histo select id_client, sysdate, code_societe , code_etabliss , date_session , date_heure , numero_ordre FROM xyz.ctransaction where id_client='&1';
但是像这样它不起作用。有没有人想办法解决这个问题?
【问题讨论】:
“不工作”是什么意思?请具体!看看for /F
loop。
但是当它不起作用时会发生什么?
“插入”不起作用。我无法从文本文件中传递所有变量
【参考方案1】:
好的,感谢@aschipfl,我使用 for /F 在我的文本文件中循环并提取我的 ID。
for /F "tokens=1-10" %%a in (%list_id_cli_temp%) do (
sqlplus -l -s %cfg.pivot.user%/%cfg.pivot.pass%@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=%cfg.pivot.server%)(Port=1521))(CONNECT_DATA=(SID=%cfg.pivot.base%))) @%sql_histo% "%%a" >> %logfile%
)
像这样,我使用前 10 行并使用 %%a 从文本文件的每一行中获取我的 ID,并通过参数将其传递给我的 sql 命令
【讨论】:
我不认为“tokens=1-10”会像你想象的那样做。FOR /?
@lit "tokens=1-10" 在我的文本文件中从第 1 行到第 10 行
这不是FOR /?
中的文档所说的。
@lit tokens=n -> 指定从每行读取哪些编号的项目(默认 = 1) tokens=2,4,6 将导致每行的第二个、第四个和第六个项目处理。 tokens=2-6 将导致处理每行的第二个、第三个、第四个、第五个和第六个项目。 tokens=* 将导致每行上的所有项目都被处理。 tokens=3* 将处理第三个token和第4个+所有后续项,这也可以写成tokens=3,*
使用 tokens= 会影响每行 ITEMS
的数量`。它与行数无关。您很幸运,您的行中只有一项,因此全部进入 %%a。以上是关于使用文本文件,其中每一行都是要传递给 SQL*Plus 的参数的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL。使用 regexp_like 正则表达式解析 clob UTF8 字符