>source

Oracle db에 간단한 테이블이 있다고 가정합니다.

CREATE TABLE schema.d_test
(
    id_record integer GENERATED AS IDENTITY START WITH 95000 NOT NULL,
    DT DATE NOT NULL,
    var varchar(50),
    num float,
    PRIMARY KEY (ID_RECORD)
)

그리고 R에 데이터 프레임이 있습니다.

dt= c('2022-01-01', '2005-04-01', '2011-10-02')
var= c('sgdsg', 'hjhgjg', 'rurtur')
num= c(165, 1658.5, 8978.12354)
data= data.frame(dt, var, num)%>%
  mutate(dt= as.Date(dt))

삽입하려고 합니다데이터오라클로d_testcode를 사용하는 테이블

data %>%
  dbWriteTable(
    oracle_con,
    value= .,
    date= T,
    'D_TEST',
    append= T,
    row.names=F,
    overwrite= F
  )

하지만 다음 오류가 반환되었습니다.

Error in .oci.WriteTable(conn, name, value, row.names= row.names, overwrite= overwrite,  :
  Error in .oci.GetQuery(con, stmt, data= value) :
  ORA-00947: not enough values

무엇이 문제입니까? 어떻게 고칠 수 있습니까? 감사합니다.

  • 답변 # 1

    이것은 순수한 Oracle입니다(저는 R을 모릅니다).

    샘플 테이블:

    SQL> create table test_so (id number generated always as identity not null, name varchar2(20));
    Table created.
    SQL> insert into test_so(name) values ('Name 1');
    1 row created.
    

    저의 초기 아이디어는 Oracle이 값을 삭제하고 자체 값을 생성하기를 바라며 ID 열에 모든 값을 삽입하도록 제안하는 것이었습니다. 그러나 작동하지 않습니다.

    SQL> insert into test_so (id, name) values (-100, 'Name 2');
    insert into test_so (id, name) values (-100, 'Name 2')
                         *
    ERROR at line 1:
    ORA-32795: cannot insert into a generated always identity column
    


    그러나 ID 열의 값을 자동으로 생성하지 않고 "해결 방법"을 사용하도록 테이블을 다시 생성할 수 있는 경우(ID 열이 상대적으로 Oracle의 새로운 기능) -시퀀스 및 트리거 -"수정"할 수 있습니다.

    SQL> drop table test_so;
    Table dropped.
    SQL> create table test_so (id number not null, name varchar2(20));
    Table created.
    SQL> create sequence seq_so;
    Sequence created.
    SQL> create or replace trigger trg_bi_so
      2    before insert on test_so
      3    for each row
      4  begin
      5    :new.id := seq_so.nextval;
      6  end;
      7  /
    Trigger created.
    

    삽입만이름(오라클은 트리거를 사용하여ID):

    SQL> insert into test_so(name) values ('Name 1');
    1 row created.
    

    이것이 code에서 수행할 작업입니다. 더미를 제공하세요.ID값, 그냥 피하기

    ORA-00947: 값이 충분하지 않습니다.

    현재 오류가 발생했습니다. Trigger는 이를 폐기하고 어쨌든 시퀀스를 사용합니다.

    SQL> insert into test_so (id, name) values (-100, 'Name 2');
    1 row created.
    SQL> select * from test_so;
            ID NAME
    ------------------------------
             1 Name 1
             2 Name 2       --> this is a row which was supposed to have ID= -100
    SQL>

  • 이전 python : setuptools find_packages()가 중첩된 디렉토리에서 파일을 찾을 수 없습니다
  • 다음 android : onSaveInstanceState()에서 안드로이드에 객체 저장