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)
...
我正在编写一个脚本,它将根据 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)
...