通过 OracleDB sqlplus 在 shell 脚本中使用 for 循环

Posted

技术标签:

【中文标题】通过 OracleDB sqlplus 在 shell 脚本中使用 for 循环【英文标题】:Using for loop in shell script over OracleDB sqlplus 【发布时间】:2019-11-19 12:11:42 【问题描述】:

我正在使用这个脚本:

#!/bin/sh
for i in $(seq 1 20);
do
 echo "CREATE TABLE eugene_$i (id NUMBER NOT NULL);
 ! sleep 10
 DECLARE j NUMBER;
 BEGIN
  FOR j IN 1..20 LOOP
   select * from eugene_$i;
   ! sleep 10
  END LOOP;
 END;
 DROP TABLE eugene_$i;" | sqlplus system/password &
done
wait

我的目的是保持连接有效,并运行重复查询以进行测试。

目标是在每次选择后等待 10 秒,然后调用下一个。

我根本没有得到选择。我假设内部 for 循环有一些语法问题。

【问题讨论】:

【参考方案1】:

当您在 PL/SQL 中发出 select 语句(作为隐式或显式游标)时,您需要将值提取到变量中。您可以返回一行或将多行批量收集到一个或多个变量中(例如,每列返回一个标量变量,或每行一条记录)。

因此,您脚本中的 PL/SQL 应该类似于:

DECLARE
  -- no need to declare the j variable; that's implicit to the `FOR ... loop`
  id number; 
BEGIN
 FOR j IN 1..20 LOOP
  select *
  into   id
  from   eugene_$i;
  ! sleep 10 -- I'm not sure this will work in your script; it's not Oracle syntax, but may get translated by your script?
 END LOOP;
END;
/

【讨论】:

谢谢,但它并不能完全满足我的要求。虽然它帮助我意识到我需要如何处理它。

以上是关于通过 OracleDB sqlplus 在 shell 脚本中使用 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

SQLPlus 中的情况

批处理文件将xml文件内容传递给sqlplus

SQLPLUS:如何使用默认服务 SYS$USERS 进行连接

使用默认 SID 的 Sqlplus 连接 Oracle DB

错误 12545:连接失败,因为尝试连接 sqlplus 时目标主机或对象不存在

在长原始列中插入值