我有三个部分的问题,因为我的要求如下。我被要求使用shell脚本自动化一些存储过程。以前存储的proc的性质(不是定义,而是在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是一个临时过程,它接受整个查询作为第一个参数。在内部,proc运行一些审计表(以及查询)来存储维护历史记录/更改。现在,我想要做的是设计一个shell脚本,它可以在不需要人工干预的情况下自动化存储的proc。
我做过这样的事
#!/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循环?
3.是否有可能从脚本中调用临时存储过程,其内容如下
execute SP_RTB_UPDATES('DECLARE v_var1....');
或者我们必须分离查询和写额外的查询来处理审计表?但这会像存储的过程一样安全吗?
请给我建议。提前感谢!
发布于 2013-05-21 16:16:03
这是一个部分答案--您正在混合shell和sqplus命令,您在这里创建了一个文档--这非常类似于直接在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”,请使用EXEC即时动态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页面底部的链接:
https://stackoverflow.com/questions/16679506
复制相似问题