【问题标题】:Running Loops in SQLPlus在 SQLPlus 中运行循环
【发布时间】:2021-05-23 20:41:01
【问题描述】:

我制作了一个 bash 脚本,它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本,如下所示。但是一旦运行它,它就会卡在循环的 BEGIN 中,如下所示。我尝试直接通过 SQLPlus 运行它,它是一样的。所以任何人都可以建议这里做错了什么。

BEGIN
  FOR l_counter IN 1..5
  LOOP
    DBMS_OUTPUT.PUT_LINE( l_counter );
  END LOOP;
END

结果:

   BEGIN
  2  FOR l_counter IN 1..5
  3  LOOP
  4  DBMS_OUTPUT.PUT_LINE( l_counter );
  5  END LOOP;
  6  END;
  7
  8

重击:

SPOOL $FILE

@/home/genesys/scripts/Counter.sql
SPOOL OFF
EXIT
EOF

编辑:这是我在末尾添加斜杠后得到的结果。

SQL> set serveroutput on;
SQL> BEGIN
  FOR l_counter IN 1..10
  LOOP
    DBMS_OUTPUT.PUT_LINE( l_counter || ' finished ');
  END LOOP;
END;/  2    3    4    5    6
  7
  8
  9
 10

【问题讨论】:

  • 在最后一个分号之后添加一个斜线,并在开头添加set serveroutput on
  • edit 您的问题并发布 bash 脚本的内容。我假设你打电话给get "sql script" 而不是start "sql script"
  • SQL*Plus 需要用斜杠终止 PL/SQL 块,否则它不知道代码的结尾在哪里。
  • @Barbaros?zhan 我这样做了,但仍然无法正常工作并且没有输出。 SQL> 设置服务器输出; SQL> BEGIN FOR l_counter IN 1..10 循环 DBMS_OUTPUT.PUT_LINE( l_counter || '完成');结束循环;结束;/ 2 3 4 5 6 7 8 9 10
  • 新行必须有斜线

标签: bash oracle loops plsql sqlplus


【解决方案1】:

您可以更喜欢使用以下两种方法之一,以便将DBMS_OUTPUT.PUT_LINE 命令的结果放入文件中

  1. 通过使用.sql文件
$ cd /home/genesys/scripts
$ sqlplus /nolog
SQL> conn un/pwd
SQL> @Counter.sql

其中Counter.sql文件有以下内容:

SET FEEDBACK OFF
SET SERVEROUTPUT ON
SPOOL output2.txt
BEGIN
FOR l_counter IN 1..10
 LOOP
  DBMS_OUTPUT.PUT_LINE(l_counter || ' finished ');
 END LOOP; 
END;
/
SPOOL OFF
  1. 通过创建.sh(Counter.sh) 文件:
record=`sqlplus -S /nolog << EOF
conn hr/hr
SET FEEDBACK OFF
SET SERVEROUTPUT ON
SPOOL output.txt
BEGIN
 FOR l_counter IN 1..10
 LOOP
   DBMS_OUTPUT.PUT_LINE(l_counter || ' finished ');
 END LOOP; 
END;
/
SPOOL OFF
EOF`

从创建文件的命令提示符调用

$ cd /home/genesys/scripts
$ . Counter.sh 

【讨论】:

  • @AhmedZein 不客气,兄弟,很高兴为您提供帮助
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多