在没有 UTL_FILE 的情况下从 SQLplus 检查 UNIX 中是否存在文件
Check if a file exists in UNIX from SQLplus without UTL_FILE
我现在的场景是这样的:
- 我需要从shell脚本登录sqlplus来调用存储过程.
- 之后我需要通过 table.
中的 SPOOLING 数据创建一个 CSV 文件
- 然后我需要检查 CSV 文件是否已在特定目录中创建,并根据结果需要 更新 查询成为 运行.
我知道这可以在 UTL_FILE 包的帮助下在 sqlplus 中检查,但不幸的是,由于客户端策略,这个包的访问是 当前系统限制。
另一种方法是退出sqlplus并在UNIX中执行文件检查,然后重新登录sqlplus执行其余操作。但我认为这会导致 执行时间变慢 并且 性能 是此实现中的一个重要因素,因为 table 包含大量数据数据(百万)。
那么有没有其他方法可以在不退出当前会话的情况下从 sqlplus 检查这个?
系统信息:
OS - 红帽企业 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,因此只要您不需要将脚本移植到其他操作系统,这对您来说就足够了。但是,您不能对文件的内容做任何事情,或解释有关它的任何事情。您所拥有的只是您 运行 命令中的 return 代码。如果您需要更复杂的东西,您可以调用生成特定 return 代码的脚本,但这会变得有点混乱。
我现在的场景是这样的:
- 我需要从shell脚本登录sqlplus来调用存储过程.
- 之后我需要通过 table. 中的 SPOOLING 数据创建一个 CSV 文件
- 然后我需要检查 CSV 文件是否已在特定目录中创建,并根据结果需要 更新 查询成为 运行.
我知道这可以在 UTL_FILE 包的帮助下在 sqlplus 中检查,但不幸的是,由于客户端策略,这个包的访问是 当前系统限制。
另一种方法是退出sqlplus并在UNIX中执行文件检查,然后重新登录sqlplus执行其余操作。但我认为这会导致 执行时间变慢 并且 性能 是此实现中的一个重要因素,因为 table 包含大量数据数据(百万)。
那么有没有其他方法可以在不退出当前会话的情况下从 sqlplus 检查这个?
系统信息:
OS - 红帽企业 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,因此只要您不需要将脚本移植到其他操作系统,这对您来说就足够了。但是,您不能对文件的内容做任何事情,或解释有关它的任何事情。您所拥有的只是您 运行 命令中的 return 代码。如果您需要更复杂的东西,您可以调用生成特定 return 代码的脚本,但这会变得有点混乱。