2

这可能是一个愚蠢的想法。我正在尝试编写一个 SQL*Plus .sql 脚本,我可以从 Windows 批处理文件中调用该脚本,该文件本身使用 dbms_output.put_line 生成一个新的 .sql 脚本。到目前为止,这就是我的脚本:

set echo off;
set serverout on;

conn user@pass;

spool E:\new_script.sql

DECLARE

  CURSOR c_groups IS
    SELECT * FROM table;

  s varchar2(4000);

BEGIN

  dbms_output.put_line('BEGIN');

  FOR x IN c_groups LOOP
    s := 'INSERT INTO TABLE blah VALUES ('''||x.name||''','||x.id||');';
  END LOOP;

  dbms_output.put_line(s);

  dbms_output.put_line('COMMIT;');

  dbms_output.put_line('END;');
  dbms_output.put_line('/');

END;
/

spool off;
exit;

但是,当我这样做时,我new_script.sql只会说“PL/SQL 过程已成功完成”。 任何想法如何使dbms_out.put_line实际显示他们的信息?

而且我实际上并没有这样做来构建插入语句 - 这些只是一个简单的示例,显示了我正在尝试做的事情的要点。

4

2 回答 2

4
  1. 您必须先连接,然后使用SET命令。所以你的三个命令应该在

    这个命令:

    conn user@pass;
    set echo off;
    set serverout on;
    

    否则,serveroutput参数将设置为其默认值

    价值,这就是OFF为什么dbms_output.put_line()

    没有按预期工作。

  2. 您应该 dbms_output.put_line(s)FOR循环内执行:

    FOR x IN c_groups LOOP
       s := 'INSERT INTO TABLE blah VALUES ('''||x.name||''','||x.id||');';
       dbms_output.put_line(s);
    END LOOP;
    

    此外,阀芯 BEGIN .. END 块是多余的。DML 语句

    (在这种情况下是一堆INSERT INTO语句)以分号结尾将是

    执行得很好,没有被包含在BEGIN END块中。

  3. 当您使用*.bat文件运行脚本时,使用

    以下命令:

    set feedback off;  -- To not spool messages like 
                       -- PL/SQL procedure successfully completed
    
    set termout off;   -- to suppress the output from a command line.
    
  4. 您的方法可能可以归结为一个简单的SELECT陈述:

    conn user@pass;
    
    set echo off;
    set serverout on;
    set feedback off;
    set termout off;
    set heading off;
    
    spool E:\new_script.sql
    
    SELECT 'INSERT INTO TABLE blah VALUES ('''||name||'''','||to_char(id)||');'
     FROM table;
    
    spool off;
    
    exit;
    
于 2013-08-21T17:43:50.400 回答
1

SPOOL将结果发送到文件;但它不能确保打印结果。启用打印到标准输出;使用SERVEROUTPUT命令。

set serveroutput on

这通常是一种糟糕的处理方式;我知道您说过这不是您实际在做的事情,但 SQL 是一种基于集合的语言。如果可能的话,做大量的事情。

于 2013-08-21T17:15:07.743 回答