首页 文章

在没有UTL_FILE的SQLplus中检查UNIX中是否存在文件

提问于
浏览
1

我目前的情况是这样的:

  • 我需要从 shell script login to sqlplus 来调用 stored procedure .

  • 之后,我需要通过SPOOLING表中的数据创建 CSV 文件 .

  • 然后我需要在特定目录中使用 check whether the CSV file has been created ,并且根据结果需要运行 update 查询 .

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

另一种方法是退出sqlplus并在UNIX中执行文件检查,然后再次登录到sqlplus以执行其余操作 . 但我认为这会导致 slower execution timeperformance 是此实现中的一个重要因素,因为这些表包含大量数据( in millions ) .

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

System Info:

OS - Red Hat Enterprise Linux

Database - Oracle 11g

1 回答

  • 2

    如果该文件位于您运行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 ,因为它不需要您的脚本可以移植到其他操作系统,这对您来说可能已经足够了 . 什么你可以't do, though, is do anything with the contents of the file, or interpret anything about it. All you have available is the return code from the command you run. If you need anything more sophisticated you could call a script that generates specific return codes, but that'变得有点凌乱 .

相关问题