如何使用 SQL Loader 将包含换行符的数据加载到 table?

How do I use SQL Loader to load data containing line breaks to a table?

我有一个数据文件,一个csv。数据文件中的一条记录如下所示:

195268,"Organization",Active,,"This is a long description. This is a long description. This is a long description. This is a long description. This is a long description. This is a long description. This is a long description. This is a long description. This is a long description.</p>
<p>&nbsp;</p>
<p><a href=""https://app.place.com/news/"">Another Sample Link</a></p>
<p><a title=""Sample Link"" href=""https://app.place.com/202290"">Sample Link</a></p>","123 Fake St.","123 Fake St.",City,99999,"(555) 555-5555",,,email@email.com,http://app.place.com,https://www.app.com/org/,,https://www.flickr.com/photos/testOrganization/,,,https://images.com/test.jpg,https://app.place.com/app/organization/Organizations,Visible,Closed,18664,Branch,,,14097304,"Org Front Desk",email@email.com

我需要使用以下架构将其加载到 table:

CREATE TABLE ORGS
 ( 
     organizationId varchar2(6),
     name varchar2(150),
     status varchar2(8),
     shortName varchar2(100),
     summary varchar2(500),
     description CLOB,
     addressStreet1 varchar2(200),
     addressStreet2 varchar2(200),
     addressCity varchar2(100),
     addressZipPostal varchar2(10),
     phoneNumber varchar2(20),
     extension varchar2(20),
     faxNumber varchar2(20),
     email varchar2(100),
     externalWebsite varchar2(250),
     facebookUrl varchar2(250),
     twitterUrl varchar2(250),
     flickrFeedUrl varchar2(250),
     youtubeChannelUrl varchar2(250),
     googleCalendarUrl varchar2(250),
     profileImageUrl varchar2(250),
     profileUrl varchar2(250),
     directoryVisibility varchar2(50),
     membershipType varchar2(10),
     typeId varchar2(5),
     typeName varchar2(100),
     parentId varchar2(6),
     parentName varchar2(50),
     primaryContactId varchar2(8),
     primaryContactName varchar2(100),
     primaryContactCampusEmail varchar2(100)
 );

我如何为这个加载构建一个 sqlLoader 控制文件?

我试过这个ctl文件


LOAD DATA
INFILE 'orgs.csv' "str '|\n'"
INTO TABLE ORGS
FIELDS TERMINATED BY ','
(
     organizationId,
     name,
     status,
     shortName,
     summary,
     description,
     addressStreet1,
     addressStreet2,
     addressCity,
     addressZipPostal,
     phoneNumber,
     extension,
     faxNumber,
     email,
     externalWebsite,
     facebookUrl,
     twitterUrl,
     flickrFeedUrl,
     youtubeChannelUrl,
     googleCalendarUrl,
     profileImageUrl,
     profileUrl,
     directoryVisibility,
     membershipType,
     typeId,
     typeName,
     parentId,
     parentName,
     primaryContactId,
     primaryContactName,
     primaryContactCampusEmail
)

还有这个

LOAD DATA
INFILE 'orgs.csv' 
CONTINUEIF LAST != '"'
INTO TABLE ORGS
APPEND
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
     organizationId,
     name,
     status,
     shortName,
     summary,
     description,
     addressStreet1,
     addressStreet2,
     addressCity,
     addressZipPostal,
     phoneNumber,
     extension,
     faxNumber,
     email,
     externalWebsite,
     facebookUrl,
     twitterUrl,
     flickrFeedUrl,
     youtubeChannelUrl,
     googleCalendarUrl,
     profileImageUrl,
     profileUrl,
     directoryVisibility,
     membershipType,
     typeId,
     typeName,
     parentId,
     parentName,
     primaryContactId,
     primaryContactName,
     primaryContactCampusEmail
)

但是oracle一直在抱怨,对于各个领域,

Fields in the data file exceeds maximum length.

我确定数据文件中的数据大小适合我创建的字段。我想知道我是否在 ctl 文件中错误地定义了数据类型,或者包含引号中包含的换行符的字段存在问题。

我已经有一段时间没有加载包含换行符的字段了,所以我对那部分没有任何评论。但是查看 this answer - 默认的 SQLLDR 数据长度是 255 个字符,所以如果你的字段之一比那个长,你必须在控制文件中指定它。对于摘要字段,我只是尝试更改

summary,

summary char(500),

对于description字段,稍微复杂一点。 AFAIK,您必须 为定界字符字段设置某种最大长度 - 如果您不担心它,您可以将其设置为较大的值,例如

description char(30000),

Oracle says that a value up to 2 gigabytes can be specified,所以我想如果您真的不想 运行 进入长度限制,您可以尝试使用 2147483647 而不是 30000。

您可能还想考虑如果 CSV 字段为空,您希望 ORGS.DESCRIPTION 的值是什么。

description char(30000) NULLIF description=BLANKS, (sets it to null)
description char(30000) DEFAULTIF description=BLANKS, (sets it to an empty LOB)