簡體   English   中英

在 Oracle 12c 的 IDENTITY 列中通過 SQL * Loader 加載數據

[英]Load data via SQL * Loader in IDENTITY column in Oracle 12c

我需要使用 SQL* Loader 將數據加載到帶有 GENERATE ALWAYS AS IDENTITY 的 Oracle 表中

CREATE TABLE tbl_identity
(
  col1 NUMBER(10,0) GENERATED ALWAYS AS IDENTITY(START WITH 7 INCREMENT BY 1)    NOT NULL,
  col2 VARCHAR2(20)
);

但是當我嘗試在此表中加載數據時,出現錯誤

ORA-32795: cannot insert into a generated always identity column

也許 SQLLDR 中有任何選項可以暫時跳過 IDENTITY?

或者也許有任何想法如何使用 SQLLDR 將數據加載到 GENERATED ALWAYS IDENTITY 列中?

SQLLDR 命令

sqlldr userid=user/passw@TNS control=tbl_identity.ctl log=tbl_identity.log rows=1000 readsize=65535 bindsize=65535

CTL文件

OPTIONS(direct=false)
LOAD DATA
INFILE 'tbl_identity.txt'
INTO TABLE tbl_identity
INSERT
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(col1,
 col2)

將您的 DDL 從GENERATED ALWAYS更改為GENERATED BY DEFAULT

我在加載數據之前使用以下腳本:

begin
  for rec in (
    select owner, table_name, column_name, generation_type
    from all_tab_identity_cols
    where owner = 'owner '
      and generation_type in ('ALWAYS')
      and table_name in ('','',......)
  )loop
     -- before load data
     if rec.generation_type = 'ALWAYS' then
       execute immediate 'alter table '||rec.owner||'.'||rec.table_name||' modify '||rec.column_name||' generated by default as identity';
     end if;
     if rec.generation_type = 'BY DEFAULT' then
     -- return (after data load)
       execute immediate 'alter table '||rec.owner||'.'||rec.table_name||' modify '||rec.column_name||' generated always as identity';
     end if;
  end loop;
end;            
/

然后一切恢復原狀。

小心,在查詢中列出正確的表!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM