0

外部テーブルがあります。そして、それらのテーブルからデータを抽出し、そのデータを他のテーブルに挿入/マージしたいと思います。

select from => insert into query または merge クエリを実行すると、データの品質が低下し、クエリが壊れる可能性があります (可能性が高い)。外部テーブルに日付として 000000 があり、データをマージするとクエリが壊れるとします。

エラー、エラーの理由、行番号、列名を記録するテーブル (たとえば) エラーテーブルにこれらのエラーを記録するにはどうすればよいですか? SQL Loader ログに表示されるのと同じように。例えば:

Record 2324: Rejected - Error on table AA_STAG_VR_01, column KS1.
ORA-01843: not a valid month

そして、クエリはむしろ壊れるべきではありません。むしろ、エラーをログに記録し、SQL ローダーで発生するように先に進みます。

出来ますか?ネットで調べてみたのですが、何も見つからないか、単に魔法の言葉を知らないだけなのかもしれません

前もって感謝します :-)

編集:わかりました、次のアプローチを使用して問題を(まあ、部分的に)解決できました。

CREATE TABLE error_table  (
   ora_err_number$ NUMBER, 
   ora_err_mesg$   VARCHAR2(2000),
   ora_err_rowid$  ROWID,   
   ora_err_optyp$  VARCHAR2(2),
   ora_err_tag$    VARCHAR2(2000) 
)

INSERT INTO destination_table (column)
SELECT column FROM external_table
LOG ERRORS INTO error_table REJECT LIMIT UNLIMITED

これは私に与えます:

SELECT * FROM error_table;

----------------------------------------------------------------------------------------------------------------------------------------------------------
ORA_ERR_NUMBER$   |   ORA_ERR_MESG$                                                              |    ORA_ERR_ROWID$    | ORA_ERR_OPTYP$   | ORA_ERR_TAG$  |
----------------------------------------------------------------------------------------------------------------------------------------------------------

12899             |ORA-12899: value too large for column "SYSTEM"."destination_table"."column"

ここまでは順調ですね。ただし、どのレコード番号 (external_table の行番号) でこのエラーが発生したかを知りたいです。最初の 10 レコードは問題なく、11 番目のレコードは悪かった可能性があるためです。

4

2 に答える 2

2

FORALL + SAVE EXCEPTIONS句を確認してください。それはあなたを助けるかもしれません。

15:57:02 @> conn hr/hr@vm_xe                                                                  
Connected.                                                                                    
15:57:15 HR@vm_xe> create table err_test(unique_column number primary key);                   

Table created.                                                                                

Elapsed: 00:00:01.51                                                                          
15:57:46 HR@vm_xe> EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('err_test', 'errlog');                

PL/SQL procedure successfully completed.                                                      

Elapsed: 00:00:00.46                                                                          
15:59:22 HR@vm_xe> insert into err_test select mod(rownum, 2) from dual connect by rownum < 10
16:00:00   2  log errors into errlog ('test') reject limit unlimited;                         

2 rows created.                                                                               

Elapsed: 00:00:00.87                                                                          
16:00:27 HR@vm_xe> commit;                                                                    

Commit complete.                                                                              

Elapsed: 00:00:00.00                                                                          
16:02:37 HR@vm_xe> col ora_err_mesg$ for a75                                          
16:02:43 HR@vm_xe> col unique_column for a10                                          
16:02:47 HR@vm_xe> select unique_column, ora_err_mesg$ from errlog;                   

UNIQUE_COL ORA_ERR_MESG$                                                              
---------- ---------------------------------------------------------------------------
1          ORA-00001: unique constraint (HR.SYS_C007056) violated                     
0          ORA-00001: unique constraint (HR.SYS_C007056) violated                     
1          ORA-00001: unique constraint (HR.SYS_C007056) violated                     
0          ORA-00001: unique constraint (HR.SYS_C007056) violated                     
1          ORA-00001: unique constraint (HR.SYS_C007056) violated                     
0          ORA-00001: unique constraint (HR.SYS_C007056) violated                     
1          ORA-00001: unique constraint (HR.SYS_C007056) violated                     

7 rows selected.                                                                      

Elapsed: 00:00:00.03                                                                  
于 2012-09-19T05:02:43.283 に答える
1

いくつかの構文の下では、sqlloaderのように拒否制限があり、ログファイル、不良ファイルなどがあります。

CREATE TABLE <table_name> (
<column_definitions>)

ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY <oracle_directory_object_name>
ACCESS PARAMETERS (
RECORDS DELIMITED BY newline
BADFILE <file_name>
DISCARDFILE <file_name>
LOGFILE <file_name>
[READSIZE <bytes>]
[SKIP <number_of_rows>
FIELDS TERMINATED BY '<terminator>'
REJECT ROWS WITH ALL NULL FIELDS
MISSING FIELD VALUES ARE NULL
(<column_name_list>))\
LOCATION ('<file_name>'))
[PARALLEL]
REJECT LIMIT <UNLIMITED | integer>;

ここにいくつかの例とここにドキュメントを参照してください

于 2012-09-19T05:45:13.153 に答える