Bash 在SQLPlus中运行循环

Bash 在SQLPlus中运行循环,bash,oracle,loops,plsql,sqlplus,Bash,Oracle,Loops,Plsql,Sqlplus,我制作了一个bash脚本,通过SQLPlus连接到数据库,并运行一个包含For循环的SQL脚本,如下所示。但一旦运行它,它就卡在循环的开头,如下所示。我试图通过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

我制作了一个bash脚本,通过SQLPlus连接到数据库,并运行一个包含For循环的SQL脚本,如下所示。但一旦运行它,它就卡在循环的开头,如下所示。我试图通过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
狂欢节:

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

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

您可以使用以下两种方法之一将
DBMS\u输出的结果放入文件

  • 通过使用
    .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
    
  • 通过创建
    .sh
    Counter.sh
    )文件:

  • 在最后一个分号后的末尾添加斜杠,并在开头添加
    set serveroutput on
    。您的问题,然后发布bash脚本的内容。我假设您正在调用
    get“sql script”
    而不是
    start“sql script”
    sql*Plus需要用斜杠终止PL/sql块,否则它不知道代码的结尾在哪里。@Barbaros?zhan我这样做了,但仍然不起作用,也没有输出。SQL>打开服务器输出;SQL>在1..10循环DBMS_输出中为l_计数器开始。放置_行(l_计数器| |“完成”);端环;完;2 3 4 5 6 7 8 9 10 a slash必须在新的线路上。非常感谢与我一起工作。@AhmedZein不客气,兄弟,很高兴能帮上忙
    $ cd /home/genesys/scripts
    $ sqlplus /nolog
    SQL> conn un/pwd
    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
    
    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