【问题标题】:SQLPlus DBMS output not the same as in developerSQLPlus DBMS 输出与开发人员中的不同
【发布时间】:2020-10-26 14:35:51
【问题描述】:

我正在编写一个脚本,它将根据表名生成 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 中换行?如果在运行脚本之前“设置 LINESIZE 100”会发生什么?
  • @pmdba 成功了。请把它作为答案,非常感谢!

标签: oracle sqlplus sql-loader


【解决方案1】:

当字符串中有换行符时,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)
...

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 1970-01-01
      • 2012-07-05
      • 2016-04-21
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多