gpt4 book ai didi

database - 在没有 UTL_FILE 的情况下从 SQLplus 检查 UNIX 中是否存在文件

转载 作者:搜寻专家 更新时间:2023-10-30 22:32:50 26 4
gpt4 key购买 nike

我现在的场景是这样的:

  • 我需要从shell 脚本登录到sqlplus来调用存储过程
  • 之后,我需要通过 SPOOLING 表中的数据创建一个 CSV 文件。
  • 然后我需要在特定目录中检查是否已创建 CSV 文件,并根据结果运行更新查询。

我知道这可以在 sqlplus 中借助 UTL_FILE 包进行检查,但不幸的是,由于客户端策略,此包的访问在当前系统中被限制 .

另一种方法是退出sqlplus并在UNIX中执行文件检查,然后重新登录sqlplus执行其余操作。但我认为这会导致执行时间变慢,而性能是此实现中的一个重要因素,因为表包含大量数据(以百万计).

那么有没有其他方法可以在不退出当前 session 的情况下从 sqlplus 检查这个?

系统信息:

操作系统 - 红帽企业 Linux

数据库 - Oracle 11g

最佳答案

如果该文件与您运行 SQL*Plus 的机器位于同一台机器上,您可能会使用 the host command .

如果您正在检查的文件与您正在假脱机处理的文件相同,那么它肯定存在,否则您将遇到某种 SP 错误;但是如果你出于某种原因确实想检查同一个文件,并假设你有一个文件名的替换变量:

define csv_file=/path/to/spool.csv
-- call procedure
spool &csv_file
-- do query
spool off

host ls &csv_file

update your_table
set foo=bar
where &_rc = 0;

如果运行 host 命令时文件存在,则 _rc 替换变量将设置为零。如果该文件不存在或由于任何原因不可读,它将是其他内容 - 例如2 如果文件不存在。将检查 &_rc = 0 添加到您的更新将意味着如果出现错误则不会更新任何行。 (当然,您仍然可以满足更新所需的任何其他条件)。

您可以通过在主机命令字符串中添加 1>/dev/null 来抑制文件名的显示;还可以通过添加 2>/dev/null 来抑制任何错误消息,尽管您可能希望看到这些消息。

文档警告不要使用 &_rc,因为它不可移植;但它适用于 RHEL,因此只要您不需要将脚本移植到其他操作系统,这对您来说就足够了。但是,您不能对文件的内容做任何事情,或解释有关它的任何事情。您所拥有的只是您运行的命令的返回码。如果您需要更复杂的东西,您可以调用生成特定返回码的脚本,但这会变得有点困惑。

关于database - 在没有 UTL_FILE 的情况下从 SQLplus 检查 UNIX 中是否存在文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41468835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com