遇到无效字符错误 - 选择行

时间:2017-02-09 14:50:29

标签: java sql oracle

我试图通过编写简单查询来使用SQLDeveloper从表中获取行:

SELECT * FROM agreements WHERE agreementkey = 1;
SELECT * FROM agreements WHERE agreementkey = 4;

但遇到无效字符时出错。 查询不是问题(使用其他键工作,即agreementkey = 3)但是在此表中使用XMLType列 - 某些行中的数据有问题。有没有办法使用查询选择这个受影响的行(我知道这个受影响的行的键)?也许导出到文件或什么?手动复制值的解决方案是不可接受的。

5 个答案:

答案 0 :(得分:1)

创建表的空副本,然后根据原始表中的select运行INSERT,但使用DML错误记录子句执行此操作。

这应该显示任何无法加载的行以及失败的原因。

CREATE TABLE test_agreements
AS SELECT * FROM agreements
WHERE ROWNUM <1;

INSERT INTO test_agreements
SELECT * 
    FROM agreements
LOG ERRORS REJECT LIMIT UNLIMITED

这将创建一个名为ERR $ TEST_AGREEMENTS的错误记录表,您可以查询该表以查找问题行。

答案 1 :(得分:0)

问题出在WHERE key = 1因为key是Oracle中的Reserve Word。你应该像

一样逃避它
SELECT * FROM table WHERE "key" = 1;

答案 2 :(得分:0)

KEY是保留字,因此要克服这一点,您需要使用双引号""

SELECT * FROM table WHERE "key" = 1;

答案 3 :(得分:0)

我认为可以通过将参数放在引号中来解决问题:

SELECT * FROM agreements WHERE agreementkey = "1";

我希望我熟悉XML,但我已经遇到了VARCHAR2列,这些列应该包含所有数值。 Oracle查看请求

where agreementkey = 1

并尝试将agreementkey转换为数字而不是1转换为varchar2。

答案 4 :(得分:0)

如果数据库包含无效字符,我会尝试以下方法之一:

  1. 使用带有错误记录子句的插入状态,可能the solution of BriteSponge将起作用。
  2. 使用datapump将数据导出到文件。我认为日志将包含识别无效列的信息。
  3. 有一个名为&#34;字符集扫描仪的工具&#34;检查表数据的字符,这里有一些文档:CSSCAN。或者您可以使用同一手册中提到的Unicode迁移助手(DMU)。 4-您可以编写一个小型PL / SQL程序,逐行检索行,如果出现错误,则会捕获异常并通知您该行。
  4. DECLARE
      invalid_character_detected EXCEPTION;
      PRAGMA EXCEPTION_INIT(invalid_character_detected, ???);    begin
    for SELECT rowid into rec FROM agreements do begin
        for 
            SELECT * into dummy 
                FROM agreements 
                where rowid=rec.rowid 
            do 
            null; 
            end loop;
        except
            WHEN invalid_character_detected THEN
                dbms_ouput.put_line(rec.rowid)
            end;
        end loop;
    end;
    

    我没有编译和测试程序。 ???是(负)错误代码,例如-XXXXX如果错误是ORA-XXXXX