首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在UNIX脚本中重新存储临时存储过程?另外,是否有可能在sql-plus中使用IF-sql/WHILE循环?

如何在UNIX脚本中重新存储临时存储过程?另外,是否有可能在sql-plus中使用IF-sql/WHILE循环?
EN

Stack Overflow用户
提问于 2013-05-21 13:08:30
回答 1查看 668关注 0票数 0

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

代码语言:javascript
运行
AI代码解释
复制
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。

我做过这样的事

代码语言:javascript
运行
AI代码解释
复制
#!/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循环?

  1. 此外,INSERT语句的“返回到”选项也无法工作。当我们在UNIX(sqlplus)中运行时,可能与之等价的是什么?

3.是否有可能从脚本中调用临时存储过程,其内容如下

代码语言:javascript
运行
AI代码解释
复制
execute SP_RTB_UPDATES('DECLARE v_var1....');

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

请给我建议。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-21 16:16:03

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

代码语言:javascript
运行
AI代码解释
复制
if [ $? -eq 0 ]

是shell命令,而不是sqlplus。如果sqlplus失败,您将永远无法进入这里的文档。不要测试它是否是这样工作的。

代码语言:javascript
运行
AI代码解释
复制
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。

代码语言:javascript
运行
AI代码解释
复制
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页面底部的链接:

statement.htm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16679506

复制
相关文章
mysql存储过程----临时表 temporary
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
4.4K0
mybatis中调用存储过程_java如何调用存储过程
CREATE PROCEDURE insert_user(OUT u_id INTEGER,IN u_name VARCHAR(20),IN u_sex VARCHAR(20),IN u_age INTEGER) BEGIN INSERT INTO t_user (name,sex,age) VALUES (u_name,u_sex,u_age); SET u_id=LAST_INSERT_ID(); END
全栈程序员站长
2022/08/03
4.2K0
mybatis中调用存储过程_java如何调用存储过程
mysql存储过程----循环结构
注意:必须在loop的业务逻辑中定义退出循环的的语句,否则出现死循环。可以使用leave关键字退出循环。
用户5899361
2020/12/07
4.1K0
MySQL存储过程-循环结构
三种循环结构为: loop……end loop while……do……end while repeat……until…end repeat
Libertyyyyy
2022/11/01
2.5K0
Mysql 导出存储过程脚本
阅读量: 20 查询数据库中的存储过程 select * from mysql.proc where db = 'dbName' and `type` = 'PROCEDURE'; 查看存储过程的创建代码 show create procedure 'proc_name'; 导出存储过程 进入mysql bin目录下 mysqldump -R -ndt dbname -u root -p > xxx.sql
李昂君
2021/12/24
1.2K0
Mysql 导出存储过程脚本
如何在环境中存储配置
关于「在环境中存储配置」,是 The Twelve-Factor App 倡导的方法论之一。通常,应用的配置在不同环境(预发布、生产环境、开发环境等等)间会有很大差异,比如说数据库的用户名密码等等配置,通过把配置和代码分离,我们可以保证部署在不同环境的代码完全一致,如何把配置和代码分离呢?最佳实战是把配置存储到环境变量中,它可以非常方便地在不同的部署间做修改,却不动一行代码;与配置文件不同,不小心把它们签入代码库的概率微乎其微;此外环境变量与语言和系统无关。
LA0WAN9
2021/12/14
1.3K0
在.NET中调用存储过程
因为做项目要用到数据库,因此存储过程是必不可少的,看了一点如何在.NET中调用存储过程的资料,颇有点心得,觉得这个东西是当用到数据库的时候必须要会的一项技术。下面是它的定义:
SAP梦心
2022/05/07
2.4K0
MySQL中的存储过程详解
简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于Java语言中的方法;
星哥玩云
2022/08/16
2.6K0
PostgreSQL中索引是否存储空值?
偶然在PostgreSQL官方文档上看到这句话:an IS NULL or IS NOT NULL condition on an index column can be used with a B-Tree index。
数据库架构之美
2021/03/16
2.5K0
Python中的while循环
原创第13篇~while循环 阅读本文大概15分钟。 文章‍结构: while定义 普通while练习 while和input函数 while 和 else while和 break while 和continue while 和 true and false 终止while死循环 while定义 for 循环是从序列中取元素,而while循环依据条件真假,决定是否执行后面的语句。 while循环语法格式如下: while condition: statements() while循环流程图 ‍whil
企鹅号小编
2018/01/10
3.5K0
Python中的while循环
python中的while循环
1、死循环学会用法 a = 1 while True: print(a) a +=1 2、无限次输入,直到输对,才退出 _age = 18 while True: guess_age = int(input("guess_age:")) if guess_age == _age: print("Good!!!!") break else: print("no,please input") 3、限制输入三次,超过三次,
py3study
2020/01/07
2.8K0
ModelBuilder中的For循环和While循环
现在开始讲迭代器,迭代是指以一定的自动化程度多次重复某个过程,通常又称为循环。说的通俗点就是批量循环处理,简称批处理。
陈南GISer
2021/08/18
4.5K0
Mariadb/MySQL存储过程中的3
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了。
py3study
2020/01/14
1K0
数据库中存储过程语法
删除语句如下: SQL @author by liu drop procedure 存储过程名
全栈程序员站长
2022/09/13
1.1K0
ModelBuilder中的For循环和While循环
现在开始讲迭代器,迭代是指以一定的自动化程度多次重复某个过程,通常又称为循环。说的通俗点就是批量循环处理,简称批处理。
陈南GISer
2021/08/18
21.7K0
mybaits使用存储过程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117668.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
4090
Sqlserver存储过程如何写循环
1.简单的循环语句 declare @i int set @i = 0 while @i < 100 begin print @i set @i = @i + 1 end 2.使用Sqlserver自带的while循环来循环表数据 -- 定义循环变量 declare @loopIndex int set @loopIndex = 0 --定义循环次数 declare @count int set @count=1 -- 取得循环次数 select @count=count(1) from sys_us
十分钟空间
2022/08/17
3.4K0
C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度。不然获取到的结果总是只有第一字符。本人就是由于这个原因,折腾了很久。在此记录一下,供大家以后参考! 例如: CREATE PROCEDURE sp_AccountRole_Create @CategoryID int, @RoleName nvarchar(10), @Description nvarchar(50), @RoleID int output AS DECLARE @Count int -- 查找是否有相同
欢醉
2018/01/22
3.3K0
如何在CDH中使用HPLSQL实现存储过程
目前版本的Hive中没有提供类似存储过程的功能,使用Hive做数据应用开发时候,一般有以下两种方法:
Fayson
2018/03/29
4.3K0
如何在CDH中使用HPLSQL实现存储过程
点击加载更多

相似问题

临时存储过程是否使用全局临时表?

11

如何在while循环中多次存储到临时表中?

10

从存储过程调用多个存储过程- sql while循环

23

使用IF语句检查临时表在存储过程中是否有行

30

如何在mysql中使用while循环调用存储过程

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档