SQLPlus DBMS 输出与开发人员中的不同

SQLPlus DBMS output not the same as in developer

我正在编写一个脚本,它将根据 table 名称生成 SQLLoader 文件。到目前为止,我已经设法做到了,但是当我 运行 SQLPlus 中的 sql 脚本时,我没有得到与开发人员中相同的输出。准确地说,是在未调用时插入了新行。我做错了什么?

以下代码只是开头,没有其他代码。当包含列时,我得到非常混乱的输出,到处都是多个换行符。

注意:我需要它 运行 通过 SQLPlus,因为我打算将代码合并到 Shell 脚本中。

SET SERVEROUTPUT ON
DECLARE
    lv_ctl VARCHAR2(32767);
    lv_tableName VARCHAR2(10) := 'MyTable';
BEGIN
    lv_ctl :=  'OPTIONS(SKIP=1)' || CHR(10)
            || 'LOAD DATA' || CHR(10)
            || 'APPEND' || CHR(10)
            || 'INTO TABLE ' || lv_tableName || CHR(10)
            || 'FIELDS TERMINATED BY ","' || CHR(10)
            || 'TRAILING NULLCOLS' || CHR(10)
            || '(' || CHR(10)
            ;   
    
    dbms_output.put_line(lv_ctl);
END;
/
SET SERVEROUTPUT OFF

当 运行 通过 developer 我得到(这是我想要的输出):

OPTIONS(SKIP=1)
LOAD DATA
APPEND
INTO TABLE MyTable
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(

当运行通过SQLPlus时:

OPTIONS(SKIP=1)
LOAD DATA
APPEND
INTO TABLE MyTable
FIELDS TERMINATED BY
","
TRAILING NULLCOLS
(

问题是我随机换行,找不到背后的原因。如您所见,第五行 (FIELDS TERMINATED BY ",") 不是内联的。

确保 SQLPlus 没有包装输出。在 运行 您的脚本之前尝试“SET LINESIZE 100”。

SQL*Plus 在字符串中包含换行符时不能很好地与 dbms_output 一起使用。由于某些原因,当 SQL*Plus 进行自己的换行时,这些将被忽略。您可以 set linesize 一个非常大的数字来避免这种情况 - 取决于控制文件的实际大小。

set linesize 4000

虽然你真的不需要包含换行符,你可以一次输出一行文件:

DECLARE
    lv_tableName VARCHAR2(10) := 'MyTable';
BEGIN
    dbms_output.put_line('OPTIONS(SKIP=1)');
    dbms_output.put_line('LOAD DATA');
    dbms_output.put_line('APPEND');
    dbms_output.put_line('INTO TABLE ' || lv_tableName);
    dbms_output.put_line('FIELDS TERMINATED BY ","');
    dbms_output.put_line('TRAILING NULLCOLS');
    dbms_output.put_line('(');
    ...
END;
/

或者根本不使用 PL/SQL,当然:

SELECT 'OPTIONS(SKIP=1)' || CHR(10)
        || 'LOAD DATA' || CHR(10)
        || 'APPEND' || CHR(10)
        || 'INTO TABLE ' || lv_tableName || CHR(10)
        || 'FIELDS TERMINATED BY ","' || CHR(10)
        || 'TRAILING NULLCOLS' || CHR(10)
        || '(' || CHR(10)
  FROM DUAL
        ;   

如果大小有问题,您可以将其设为 CLOB:

SELECT to_clob('OPTIONS(SKIP=1)') || CHR(10)
...