我有一个由我的以下要求引起的三部分问题。我被要求使用 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 ]..
抛出错误为“未知命令,剩余行被忽略”。那么,是否有可能在 sqlplus(unix) 语句中有 IF-ELSE/WHILE 循环
- 此外,INSERT 语句的 RETURNING INTO 选项不起作用。当我们在 UNIX(sqlplus) 中运行时,它的可能等价物是什么?
3.是否可以从脚本中调用临时存储过程,例如
execute SP_RTB_UPDATES('DECLARE v_var1....');
或者我们必须分开查询和编写额外的查询来处理审计表?但这会像存储过程一样安全吗?
请指教。提前致谢!