Oracle SQL-Loader 有效处理值中的内部双引号

2023-12-11

我遇到了一些 Oracle SQL Loader 挑战,正在寻找一种高效且简单的解决方案。 我要加载的源文件是管道|分隔,其中值用双引号括起来"。 问题似乎是某些值包含内部双引号。

e.g.: ..."|"a":"b"|"...

这导致我的记录被拒绝,理由是:

no terminator found after TERMINATED and ENCLOSED field

网上有各种解决方案,但似乎都不合适:

[1] 我尝试替换引用引号中的所有内部双引号, 但似乎当将此功能应用于控制文件上的太多字段时 (我有大约 2000 个字段并使用 FILLER 仅加载一个子集) 装载机再次抱怨:

SQL*Loader-350: Syntax error at line 7.
Expecting "," or ")", found ",".
field1  char(36) "replace(:field1,'"','""')",

(我不知道为什么,但当将此解决方案应用于列的狭窄子集时,它似乎确实有效)

问题是所有字段都可能包含内部双引号。

[2] 我可以在省略全局时加载所有数据optionally enclosed by '"',但随后所有括起来的引号都会成为目标表中数据的一部分。

[3] 我可以省略全局optionally enclosed by '"'语句并仅将其放置在选定的字段中, 同时尝试"replace(:field1,'"','""')"其余部分的声明,但这很难实施, 因为我无法提前知道哪些可疑字段包含内部双引号。

这是我的问题:

  1. 是否没有简单的方法来说服加载程序小心处理内部双引号(当值被它们括起来时)?

  2. 如果我被迫临时修复数据,是否有一个单行Linux命令可以仅将内部双引号转换为另一个字符串/字符, 比如说,单引号?

  3. 如果我被迫将带有引号的数据加载到目标表中,是否有一种简单的方法可以从所有字段中删除包含的双引号, 一次全部完成(该表有约 1000 列)。对于非常大的表,该解决方案的实用性能是否明智?


如果封闭字段中从未有管道,则可以从控制文件中执行此操作。不幸的是,如果您可以在一个字段中同时使用管道和双引号,那么我认为您别无选择,只能预处理文件。

您的解决方案 [1],替换双引号使用 SQL 运算符,发生得太晚而无用;在执行 SQL 步骤之前,SQL*Loader 已经解释了分隔符和括弧。您的解决方案 [2](忽略外壳)将与 [1] 结合使用 - 直到其中一个字段确实包含管道字符。解决方案 [3] 与全局使用 [1] 和/或 [2] 存在相同的问题。

的文档指定分隔符提到:

有时,作为分隔符的标点符号也必须包含在数据中。为了实现这一点,两个相邻的分隔符被解释为该字符的一次出现,并且该字符包含在数据中。

换句话说,如果你重复双引号inside然后字段将被转义并出现在表数据中。由于您无法控制数据生成,因此您可以预处理获得的文件,以将所有双引号替换为转义双引号。除非你不想更换all其中 - 那些实际上是真正的外壳的不应该被逃脱。

您可以使用正则表达式来定位相关字符,从而跳过其他字符。不是我的强项,但我认为你可以做到这一点前瞻和后瞻断言.

如果你有一个名为orig.txt包含:

"1"|A|"B"|"C|D"
"2"|A|"B"|"C"D"
3|A|""B""|"C|D"
4|A|"B"|"C"D|E"F"G|H""

你可以这样做:

perl -pe 's/(?<!^)(?<!\|)"(?!\|)(?!$)/""/g' orig.txt > new.txt

它查找前面没有行起始锚点或管道字符的双引号;并且后面没有管字符或线端锚;并仅替换那些带有转义(双)双引号的内容。这会让new.txt包含:

"1"|A|"B"|"C|D"
"2"|A|"B"|"C""D"
3|A|"""B"""|"C|D"
4|A|"B"|"C""D|E""F""G|H"""

字段开头和结尾的双引号不会被修改,但中间的双引号现在会被转义。如果您随后使用带双引号的控制文件加载该文件:

load data
truncate
into table t42
fields terminated by '|' optionally enclosed by '"'
(
  col1,
  col2,
  col3,
  col4
)

那么你最终会得到:

select * from t42 order by col1;

      COL1 COL2       COL3       COL4                
---------- ---------- ---------- --------------------
         1 A          B          C|D                 
         2 A          B          C"D                 
         3 A          "B"        C|D                 
         3 A          B          C"D|E"F"G|H"        

希望与您的原始数据匹配。可能存在不起作用的边缘情况(例如双引号后跟管道within一个字段),但是尝试解释其他人的数据时可以做的事情是有限的......当然,也可能有(更多)更好的正则表达式模式。


您还可以考虑使用外部表如果数据文件位于(或可以位于)Oracle 目录中并且您具有正确的权限,则可以使用 SQL*Loader 来代替 SQL*Loader。您仍然需要修改该文件,但是您可以使用以下命令自动完成此操作preprocessor指令,而不需要在调用 SQL*Loader 之前显式执行此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle SQL-Loader 有效处理值中的内部双引号 的相关文章

  • 如何使用 oracle SQL 执行线性插值?

    我正在尝试使用 Oracle 11g 开发中为 11 1 生产中为 11 2 进行数值分析 特别是对具有三列感兴趣的表进行线性插值 时间戳 deviceid 和值 值列保存来自设备 具有 ID deviceid 的数据 这些数据是在时间戳中
  • 物化视图中完全刷新和快速刷新有什么区别?

    我在自己的模式中有物化视图 物化视图源是另一个模式表 但是 这个主表有 900 行 我在这个主表上做了一些 dml 操作 之后我将刷新这个物化视图 正如你所知 我做了一些研究 我如何刷新我自己的物化视图 它说 你可以进行完全刷新或快速刷新
  • ORACLe PROCEDURE - AUTHID 仅允许在模式级别

    在尝试通过过程创建表时 我遇到了类似的错误 错误 73 9 PLS 00157 仅在架构级程序上允许 AUTHID PROCEDURE BCKUP AUTHID CURRENT USER AS statusmsg VARCHAR2 400
  • 插入期间违反唯一约束:为什么? (甲骨文)

    我正在尝试在表中创建一个新行 表上有两个约束 一个是关键字段 DB ID 另一个是将值限制为字段 ENV 中的几个之一 当我进行插入时 我没有将关键字段作为我尝试插入的字段之一 但我收到此错误 unique constraint N390
  • 如何找到 Oracle 视图的基础列和表名称?

    这听起来应该很简单 但事实并非如此 我找不到任何 Oracle 元数据 视图可以提供 Oracle 视图列的基础列和表名称 我发现这样做的唯一方法是解析视图源 SQL 这与精确的科学相去甚远 为了解释我想要什么 请考虑我在 SCOTT 模式
  • 在 Oracle 过程中实现多线程

    我正在研究 Oracle 10gR2 这是我的问题 我有一个程序 我们称之为 proc parent 在包内 应该调用另一个过程 让我们调用它 用户创建 我得打电话 用户创建 在一个循环中 它从表中读取一些列 并且这些列值作为参数传递给 用
  • Oracle SQL 触发器上的变异表

    我正在尝试执行触发器 但出现变异表错误 SQL 代码是这样的 CREATE OR REPLACE TRIGGER CHK Apartado D BEFORE INSERT OR UPDATE ON CONTRACTS FOR EACH RO
  • PL/SQL 过程成功完成但没有显示任何内容

    我有以下过程代码 create or replace PROCEDURE Ventas cliente p DNI IN CHAR IS CURSOR c pedidos clientes IS SELECT FROM Pedidos ve
  • 当网站停止时,Oracle 数据提供程序会固定 IIS 工作进程

    我们在 Oracle 11g 第 2 版中遇到了一个严重的问题 其中 w3wp 进程接管了整个处理器核心 并且调试显示 Oracle 数据提供程序无限地抛出 ThreadAbortException 开发人员通过执行以下操作发现了此问题 1
  • 关于pl/sql存储程序文本的问题

    我使用 TOAD 进行 PL SQL 开发 在 TOAD 中 当我输入过程名称并按 f4 时 我可以看到该过程的源代码 我认为 TOAD 从 v sqltext 视图获取源代码 为了证实我的想法 我写了一个查询 select from v
  • Oracle 11g OFFSET FETCH 给出错误

    我正在进行查询并尝试从数据库中获取随机数量的行 但 Oracle 一直告诉我我的命令尚未正确结束 select from random table order by random column name offset 0 rows fetc
  • 使用 to_char 格式化间隔

    以下 SQL 命令 select TO CHAR NVL arg1 arg2 TO DSINTERVAL 0 00 00 00 from table1 生成格式为 000000000 00 03 01 954000 的结果 是否可以在 to
  • 递归 SQL 给出 ORA-01790

    使用 Oracle 11g 第 2 版 以下查询给出 ORA 01790 表达式必须与相应表达式具有相同的数据类型 with intervals time interval AS select trunc systimestamp from
  • 授予用户在查询时使用表索引的什么?

    我想知道当用户从表中查询数据并且该用户已被授予以下权限时 oracle 是否使用索引 grant select on table to user 我想知道是否需要其他拨款才能使用索引 不 没有要求 或能力 授予对索引的访问权限 如果用户可以
  • 通过 Oracle 的数据库链接运行 SQL Server 存储过程

    参考如何通过数据库链接执行 Oracle 存储过程 https stackoverflow com questions 240788 how to execute an oracle stored procedure via a datab
  • Oracle查询结果分页无TABLE FULL SCAN数据访问方式

    stackoverflow 上有很多关于如何正确执行分页的问题 对于 Oracle 来说 最流行的答案是这样的 select from select row rownum rownum from select from some table
  • 在触发期间更新 oracle 中的同一行?

    简短的问题 因为我不知道如何搜索这个 我可以 重新更新 同一行吗 例如 我有一个存储付款小计的字段 并且考虑到我的业务限制 我可以更新该值 我可以仅用触发器更新同一行的总计吗 预先谢谢您 顺便说一句 我正在使用 Oracle 和 PL SQ
  • 删除连接到另一表 SQL 的一个表中的记录

    我有两个表 一个包含 212 000 条记录 已弃用的记录 另一个包含 10 500 000 条记录 我想在 id 和 version number 字段上连接两个表 因为两个表都有这些字段 我希望从连接表中删除匹配的记录 来自连接表 即从
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • dyld:找不到符号:__TMPdCSs12AnyGenerator

    当我尝试构建并运行我的项目时 它给了我一个错误symbol not found TMPdCSs12AnyGenerator 我已经在我的系统上安装了 Xcode 7 beta 当我安装时它给我一个错误未找到领域模块所以我只是删除了领域框架
  • 如何对合并光标进行排序?

    任务是将来自 2 个具有相似列的不同表的数据组合起来 并按一列排序 看起来 MergeCursor 可能会有所帮助 但不知道如何对项目进行排序 我现在看到的唯一解决方案是手动转换为 ArrayAdapter 或者进行偷偷摸摸的 JOIN 尚
  • 为什么只允许UI线程修改UI?

    我知道 如果我从不同的线程修改控件 我应该小心 因为 WinForms 和 WPF 不允许从其他线程修改控件的状态 为什么会有这样的限制 如果我可以编写线程安全代码 我应该能够安全地修改控件状态 那么为什么会有这样的限制呢 一些 GUI 框
  • 如何获取从 FileProvider 类获取的图像文件的方向?

    背景 针对API 24或更高版本 开发人员需要使用FileProvider 或他们自己的ContentProvider 而不是使用简单的 Uri fromFile 命令 以便让其他应用程序访问该应用程序的文件 问题 我尝试使用以下代码打开相
  • MySQL 查询使用 JOIN 不使用 INDEX

    我在 MySQL 简化 中有以下两个表 clicks InnoDB 包含约 70 000 000 条记录 有一个索引date added column 有专栏link id它指的是记录links table links MyISAM 包含的
  • Jetty 9(嵌入式):在运行时添加处理程序

    有没有办法将处理程序添加到正在运行的嵌入式 Jetty 实例 我们已将旧的基于 Jetty 6 的项目迁移到 Jetty 9 我们的插件系统需要能够添加和删除动态处理程序 请参阅下面的示例 Server server new Server
  • IstIO 出口网关出现 HTTP 503 错误

    我有以下用于部署 IstIO 出口网关路由的清单 apiVersion networking istio io v1alpha3 kind ServiceEntry metadata name REDACTED egress se spec
  • 覆盖图形内容的窗框

    这是我在这里发表的第一篇文章 我有一个看起来很菜鸟的问题 但这在过去一个小时左右一直困扰着我 我正在制作一个简单的 JFrame 其中包含 JPanel 但 Windows 7 边框似乎挡住了我对面板部分内容的查看 例如 如果我在坐标 0
  • 计算 PANDAS groupby 中具有连续日期的行数

    这是我发现的最接近我正在寻找的内容 假设我的数据框看起来像这样 d item number K208UL AKD098008 DF900A K208UL AKD098008 Comp ID 998798098 988797387 12398
  • 将 C#/.NET 中的位图序列化为 XML

    我想要XML序列化一个复杂的类型 类 它有一个System Drawing Bitmap 类型的属性除其他外
  • ASP.NET 不良实践:会话中存储不可序列化的对象

    我有一个类似的代码 Session key value 但根据 Fortify SCA 由于 会话中存储了不可序列化的对象 这被认为是一种不好的做法 Screenshot as below 解决这个问题的最佳方法是什么 如何使字符串 val
  • sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres

    我正在尝试使用 SQLAlchemy 连接到 Postgres 数据库 我已经安装了psycopg2 但是 我收到错误sqlalchemy exc NoSuchModuleError Can t load plugin sqlalchemy
  • 如何使文本视图完全像这样[重复]

    这个问题在这里已经有答案了 尝试构建购物车并希望显示折扣价格 而对于旧价格希望将其显示为如图所示 textview getPaint setFlags Paint STRIKE THRU TEXT FLAG Paint ANTI ALIAS
  • 如何解决 Jackson 无法处理 JPA beans 中的直接自引用的问题

    因此 我正在使用 Java Hibernate JPA 注释 JAX RS 注释 JAXB 注释 Jersey 和 Jackson JSON 解析器开发 RESTful 数据 API 在尝试了 Jersey 提供的 MAPPING 和 NA
  • 如何在Android中将base64转换为位图

    我想获取一个从 base64 解码的字节数组并将其显示在 Android 中的 ImageView 上 我从数据库中获取字节数组 byte blob c getBlob 1 I do this to see if the cursor is
  • 如何使用 php 修剪所有前导/尾随
    代码

    我正在尝试删除所有前导和尾随 br 使用 PHP 在字符串中 这是一个例子 br br Hello br World br p This is a message br p br br br br 我想回来 Hello br World b
  • C 中按值调用和按引用调用如何工作?

    在 C 程序中 按值调用函数如何工作 按引用调用如何工作 以及如何返回值 按值调用 void foo int c c 5 5 is assigned to a copy of c 像这样称呼它 int c 4 foo c c is stil
  • 为什么使用输入组会破坏引导程序中的基线对齐?

    如果我有一个表单 输入旁边有一个标签 采用纯 HTML 并且两者都是内联 或内联块 那么它们将按基线对齐 但是 当使用引导程序并将输入放入输入组时 它们似乎按底部对齐 我尝试在没有引导程序的情况下复制它 但我做不到 它只是有效 我创建了小提
  • 如何使用充满测试用例的输入文件来测试 Python 脚本?

    我正在参加在线法官竞赛 我想使用充满测试用例的 in 文件来测试我的代码 以对我的算法进行计时 如何让我的脚本从此 in 文件获取输入 所以脚本通常从 stdin 获取测试用例 现在您想使用文件中的测试用例进行测试 如果是这种情况 请使用
  • Oracle SQL-Loader 有效处理值中的内部双引号

    我遇到了一些 Oracle SQL Loader 挑战 正在寻找一种高效且简单的解决方案 我要加载的源文件是管道 分隔 其中值用双引号括起来 问题似乎是某些值包含内部双引号 e g a b 这导致我的记录被拒绝 理由是 no termina