2014-01-05 2 views
1

여기oracle에 기존 레코드가있는 테이블에서 레코드를 찾는 방법은 무엇입니까?

insert into test values(1,'a1','a2',...,'an'); 
insert into test values(2,'a1','a3',...,'am'); 
insert into test values(3,'a4','a2',...,'ax'); 

는 이제 ID = 1 예 포어 (행을 하나 개의 행을 복사 할 필요가 일부 예 데이터로 채워진 컬럼

create table test (
id number, 
col_1 varchar2(50), 
col_2 varchar2(50), 
. 
. 
col_n varchar2(50) 
); 

테이블 높은 번호 테이블의) 결과가 다른 행과 유사하지 않으면 (ID를 고려하지 않고) 한 열의 값만 변경하십시오. 이 같은 어떤 것을 :

declare 
r test%rowtype; 
var1 number; 
begin 
insert into r from test where id = 1; 
r.col_2='a3'; 
select count (*) into var1 from test where 'the row without id' = r; 
if (var1 = 0) then 
    insert into test values r; 
end if; 
end; 

하지만 난 오라클의 선택 부분을 작성하는 방법을 모르겠어요. 테이블 테스트에는 많은 컬럼이 있으므로 where 절에 모든 컬럼을 쓸 수는 없다고 생각하십시오.

+1

오라클이 정말로에서 참조 할 수있는 컬럼의 수를 제한하지 않습니다'where' 절과는의 열 수를 제한하지 테이블. 컬럼이 많으면 메타 데이터 테이블을 사용하여 테이블을 추출하고 코드를 생성하십시오. –

+1

[관련 질문, 아마도,하지만 꽤 동일하지] (http://stackoverflow.com/q/9133120/266304). 카운트를 할 때와 삽입 할 때 사이의 경쟁 조건 가능성을 고려해 볼 가치가 있습니다. 작은 창이지만 두 개의 세션이 여전히 충돌하여 중복을 삽입 할 수 있습니다. 모든 열에 대한 고유 색인은 상당한 오버 헤드가 될 수 있지만 아마도 고려 될 수 있으며 또한 계산 속도를 높일 수 있습니다. –

+0

아마도'select' 쿼리에서'id is null'입니까? – Rachcha

답변

2

당신이 필요로하는 것을 이해하는 것은 일종의 일종입니다. 내가 여기서 총에 맞을거야. 이 트랙에 있다면 알려주십시오 ....

쉽게 작업 할 수 있도록 테이블에 고유 인덱스를 만들 수 있습니까?

create unique index test_uidx on test (col_1, col_2, ... col_n); 

그리고하자 오라클은 작업을 수행합니다

declare 
     r  test%rowtype; 
     var1 number; 
    begin 
     select * into r from test where id=1; --- get the row 
     r.col_1 := 'some new value';   --- change 1 value 

     begin 
     insert into test values r;   --- insert the row 
     exception 
     when dup_val_on_index then   --- row was a dup 
      null;        --- and did not insert 
     end; 
    end; 
+0

나는 색인을 만들 수 있다고 생각합니다. 어떻게 작동합니까? 삽입 된 행이 복제되면 오라클이 해당 행을 삭제할 것입니까? 더 설명해 주시겠습니까? –

+0

행이 중복되면 삽입되지 않고 예외가 발생합니다. – hmmftg

+1

예외가 발생하면 제어가 예외 처리기로 넘어 가서 레코드가 삽입되지 않고 "null;" 라인에 도달 한 후 처리가 계속됩니다. "null;" "인상"으로 변경되었습니다. dup_val_on_index 오류가 발생합니다. 그냥 "null;" 오류는 표시되지 않습니다. 이해가 되니? –

관련 문제