使用文本文件,其中每一行都是要传递给 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 游标?

如何传递从多个表创建的 PL/SQL 游标记录?

PL/SQL。使用 regexp_like 正则表达式解析 clob UTF8 字符

在 PL/SQL 中将数据从文本文件复制到 CLOB

PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行

将 oracle.sql.ARRAY 传递给 PL/SQL 过程时设置时区