我试图通过编写简单查询来使用SQLDeveloper从表中获取行:
SELECT * FROM agreements WHERE agreementkey = 1;
SELECT * FROM agreements WHERE agreementkey = 4;
但遇到无效字符时出错。 查询不是问题(使用其他键工作,即agreementkey = 3)但是在此表中使用XMLType列 - 某些行中的数据有问题。有没有办法使用查询选择这个受影响的行(我知道这个受影响的行的键)?也许导出到文件或什么?手动复制值的解决方案是不可接受的。
答案 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)
如果数据库包含无效字符,我会尝试以下方法之一:
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