【问题标题】:Call PL/SQL block in unix script在 unix 脚本中调用 PL/SQL 块
【发布时间】:2021-05-17 06:10:01
【问题描述】:

我正在尝试使用 sqlplus 在 unix 脚本中调用 pl/sql 块。我只是尝试打印一个语句,但没有打印任何内容,我也没有收到任何错误。

Result=`sqlplus -s $TgtUsrID/$TgtPswd@$TgtServer <<eof
whenever sqlerror exit sql.sqlcode;
SET SERVEROUTPUT ON;
BEGIN
   DBMS_OUTPUT.PUT_LINE('Hello World!');
END;
eof
`
current_time=`date`
echo " Script execution   finished at $current_time"

【问题讨论】:

    标签: oracle unix plsql sqlplus


    【解决方案1】:

    只需要在最后一个EOF 之后用美元运算符添加变量(Result) 以及echo 命令,例如

    Result=`sqlplus -S /nolog << EOF
     conn $TgtUsrID/$TgtPswd@$TgtServer
     whenever sqlerror exit sql.sqlcode
     set feedback off
    
     SET SERVEROUTPUT ON;
     BEGIN
       DBMS_OUTPUT.PUT_LINE('Hello World!');
     END;
     /
    EOF`
    
    echo $Result    
    echo Script execution finished at $(date)
    

    会产生这样的结果

    Hello World!
    Script execution finished at Tue Feb 14 00:15:51 +03 2021
    

    最后一个echo 之后的描述引号是多余的,并且更喜欢使用与/nolog 的连接更安全,因为在当前情况下,每当ps -ef 命令发出时,架构的密码就会被公开。

    【讨论】:

    • 为什么时间戳超过 2 周前?
    • 我明白了。您拥有其中一台老式慢速虚拟机..... ;-)
    • 顺便说一句关于编码效率...而不是两行“current_time=date”和“echo Script execution finished at $current_time”,你可以/应该只是简单地“echo Script execution于 $(date) 完成”
    • @EdStevens:忘记编码效率。对我来说,这完全是关于代码冗长和想知道current_time 是否会在某个地方再次使用。
    • @wallyk - 好吧,我所说的“代码效率”实际上是指编写代码,而不是执行它。当然,如果我需要多次引用相同的值,我会把它放在它自己的变量中。但是在这种情况下,当它显示给定活动的当前时间时,如果已经有一个内置变量,那么在变量中捕获当前时间是没有意义的。请注意,“echo date”与“echo $(date)”相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2021-12-18
    • 2014-09-30
    • 2020-10-04
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多