如何在UNIX shell脚本中执行临时存储过程?在sql plus中也可以有IF-ELSE/WHILE循环吗?

如何在UNIX shell脚本中执行临时存储过程?在sql plus中也可以有IF-ELSE/WHILE循环吗?,unix,plsql,sqlplus,Unix,Plsql,Sqlplus,我有一个由三部分组成的问题,这是由我的以下要求引起的。我被要求使用shell脚本自动化一些存储过程。以前,存储过程的性质(不是定义,而是PL/SQL中的执行方式)是这样的 begin SP_RTB_UPDATE('DECLARE v_var1; begin INSERT INTO TRADINGACCOUNT(TAEXTREFSEQID, TRADINGACCOUNTID,

我有一个由三部分组成的问题,这是由我的以下要求引起的。我被要求使用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;
#!/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
因此,基本上,存储过程是一个临时过程,它接受整个查询作为第一个参数。在内部,proc运行一些审计表(连同查询)来存储和维护历史记录/更改。现在,我想做的是设计一个shell脚本,它可以自动执行存储过程,而无需手动干预

我做过类似的事情

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;
#!/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
或者我们必须分离查询和编写附加查询来处理审计表?但这会像存储过程一样具有故障安全性吗


请告知。提前谢谢

这是一个部分答案-您正在混合使用shell和sqplus命令 您创建了一个here文档,这非常类似于直接在sqlplus中键入

if [ $? -eq 0 ]
是一个shell命令,而不是sqlplus。如果sqlplus失败,您将永远无法进入here文档。不要测试它是否以这种方式工作

sqlplus usr/pwsd@instance <<-EOF

-- sqlplus DML and PL/SQL only commands in here: SELECt, UPDATE, etc.    
EOF
[ $? -ne 0 ] && echo 'failure'
以上只是传递示例,请在此学习如何执行此操作,请按照动态SQL页面底部的链接进行操作:


谢谢您的回复。可变输入,特别是sqlplus和unix commanline之间的差异。谢谢!