首页 文章

如何在UNIX shell脚本中执行ad-hoc存储过程?也可以在sql-plus中使用IF-ELSE / WHILE LOOPS吗?

提问于
浏览
0

我有一个由以下要求引起的三部分问题 . 我被要求使用shell脚本自动化一些存储过程 . 之前的存储过程的性质(不是定义,而是在PL / SQL中执行的方式)曾经是这样的

begin
  SP_RTB_UPDATE('DECLARE v_var1;
                 begin
                   INSERT INTO TRADINGACCOUNT(TAEXTREFSEQID, TRADINGACCOUNTID,
                                              LASTUPDATEDBY, LASTUPDATEDATE,
                                              EXTERNALSYSTEMREFERENCEVALUE)
                      VALUES (SEQ_TA_EXT_REF_ID.NEXTVAL,12345,
                              9999,sysdate,
                              v_var1) 
                      RETURNING TAEXTREFSEQID INTO V_PK;

                   INSERT INTO EXTREFSTATUS( TAEXTREFSEQID, SINCEDATETIME, 
                                             STATUSID, LASTUPDATEDBY )
                     VALUES ( V_PK, SYSDATE, 54, 9999 );');
end;

所以基本上,存储过程是一个特殊的过程,它接受整个查询作为第一个参数 . 在内部,proc运行一些审计表(以及查询)来存储维护历史/更改 . 现在,我想要做的是设计一个shell脚本,它可以自动执行存储过程而无需人工干预 .

我做过这样的事情

#!/bin/bash

echo "Please enter your username"

read DBUSER

echo "Please enter your password"

read DBUSERPASSWORD

echo "Please enter the Database name"

read DBSID

sqlplus -S $DBUSER/$DBUSERPASSWORD@$DBSID <<EOF

if [ $? -eq 0 ]

then

            echo "Connection OK"

            echo "Please insert the RMS code to be added"

            read RMS

            INSERT INTO TRADINGACCOUNT(TAEXTREFSEQID,TRADINGACCOUNTID,
                                       LASTUPDATEDBY, LASTUPDATEDATE, 
                                       EXTERNALSYSTEMREFERENCEVALUE )
              VALUES (SEQ_TA_EXT_REF_ID.NEXTVAL,12345,
                      9999,sysdate,
                      '$RMS')
              RETURNING TAEXTREFSEQID INTO V_PK;

         INSERT INTO EXTREFSTATUS( TAEXTREFSEQID, SINCEDATETIME,
                                   STATUSID, LASTUPDATEDBY )
           VALUES ( V_PK, SYSDATE, 54, 9999 );

   COMMIT;

ECHO "Done Successfully"
else
 echo "Connection NOT OK"
fi

现在这段代码存在很多问题 . 以下是我的疑惑 .

  1. if [ $? eq 0 ].. 正在抛出错误"unknown command, remaining line neglected" . 那么,是否可以在sqlplus(unix)语句中使用IF-ELSE / WHILE循环
  • 此外,INSERT语句的RETURNING INTO选项不起作用 . 当我们在UNIX(sqlplus)中运行时,可能的等价物是什么?

3.尽可能从脚本中调用adhoc存储过程

execute SP_RTB_UPDATES('DECLARE v_var1....');

或者我们必须将查询和写入额外的查询分开来处理审计表?但这会像存储过程一样安全吗?

请指教 . 提前致谢!

1 回答

  • 0

    这是一个部分答案 - 你正在混合shell和sqplus命令你创建了一个here文档 - 这就像直接输入sqlplus一样 .

    if [ $? -eq 0 ]
    

    是一个shell命令而不是sqlplus . 如果sqlplus失败,你永远不会进入这里的文件 . 不要测试它是否有效 .

    sqlplus usr/pwsd@instance <<-EOF
    
    -- sqlplus DML and PL/SQL only commands in here: SELECt, UPDATE, etc.    
    EOF
    [ $? -ne 0 ] && echo 'failure'
    

    同样: read RMS 在此文档之前 .

    关于创建“整个命令ad-hoc”,使用EXEC IMMEDIATE - 动态SQL

    RMS=13
    USER=foo
    PSWD=foo
    mycommand=$(printf "EXEC immediate 'select blah from table where blah = %s';"  "$RMS" )
    
    sqlplus @USER/$PWSD/@instance <<-EOF
        $mycommand
    EOF
    

    以上只是通过示例,请在此处了解如何执行此操作,请按照动态SQL页面底部的链接进行操作:

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm

相关问题