Oracle 에 수정 사항 이 존재 하고 삽입 기록 이 존재 하지 않 습 니 다.

18568 단어 Oacle
프로 그래 밍 을 접 한 이래 데이터 저장 에 사용 해 온 MS SQL.Oracle 이라는 이름 은 저 에 게 이렇게 익숙 하지만 그 내용 은 낯 설 습 니 다. 최근 에 회사 의 한 프로젝트 가 Oracle 을 사 용 했 기 때문에 Oracle 을 높이 사용 하기 시 작 했 습 니 다.Oracle 을 접 하기 전에 많은 사람들 이 Oracle 의 문법 이 MS SQL 과 차이 가 많 지 않다 고 말 하 는 것 을 들 었 습 니 다. 저 는 친구 들 사이 에서 도 이 관점 을 자랑 하 는 것 을 도 왔 습 니 다.친구 들 에 게 Oralce 는 MSSQL 과 차이 가 많 지 않다 고 말 합 니 다. 확실히 CRUD 를 보면 거의 다 르 지 않 은 것 같 지만 Oracle 을 천천히 이해 할 때 이 관점 이 좀 어 리 석 다 는 것 을 알 게 될 것 입 니 다.
먼저 흔히 볼 수 있 는 개발 사례 를 말씀 드 리 겠 습 니 다. Account 표 가 있 는데 두 개의 필드 가 AccountID, AccountName 입 니 다. 그 중에서 AccountID 를 메 인 키 로 하고 이 표 에 데 이 터 를 삽입 하 며 메 인 키 를 유일한 표지 로 합 니 다. 표 에 이 기록 이 존재 하면 수정 하고 존재 하지 않 으 면 추가 합 니 다.
MS SQL 에서
먼저 Account 표를 만 듭 니 다. 간단 하기 위해 서 nvarchar (50) 를 필드 형식 으로 합 니 다.구체 적 인 코드 는 다음 과 같다.
if object_id(N'Account',N'U') is not null
drop table Account
create table Account
(
    AccountID nvarchar(50) primary key  not null,
    AccountName nvarchar(50)
)

다음 에 우리 가 해 야 할 일 은 바로 이 표 에 데 이 터 를 삽입 하 는 것 이다.
if not exists (select * from Account where AccountID = '1') 
    insert into Account(AccountID,AccountName) values('1','Sam Xiao')
else
    update Account set AccountName = '  ' where AccountID = '1'

이런 코드 는 우리 가 SQL 에서 이렇게 자 연 스 럽 고 능숙 하 게 썼 지만, 당신 은 Oracle 에서 이런 방식 으로 쓰 면 귀 찮 은 일 을 만 날 수 있 습 니 다.그럼 이제 오 라 클 에서 이런 요 구 를 어떻게 완성 하 는 지 보 여 드 리 겠 습 니 다.
2: Oracle 에서
 먼저 시 계 를 만 드 는 것 은 미세한 차이 가 있 습 니 다. 하나의 표 가 존재 하 는 지 판단 하고 MS SQL 에 익숙 한 OBJECT 입 니 다.ID ('대상 표', '대상 유형') 의 어린이 신발 들, 오 라 클 에 도 이런 기능 이 있어 야 한다 고 생각 하 시 나 요?안 타 깝 게 도 Oracle 에는 표 가 존재 하 는 지 여 부 를 판단 하 는 함수 가 없습니다. 그러면 완곡 한 방식 으로 만 이 루어 질 수 있 습 니 다. MS SQL 에는 Select Name From SysObjects Where XType = 'U' 와 같은 데이터베이스 시트 가 있 습 니 다. 이에 대응 하 는 Oracle 에는 select 가 있 습 니 다.  * from user_tables, 시스템 표를 조회 하여 이 표 가 데이터베이스 에 존재 하 는 지 여 부 를 판단 하고 존재 하면 삭제 한 다음 에 만 듭 니 다.
declare num number;   
begin
    select count(1) into num from user_tables where table_name='ACCOUNT';   
    if num > 0 then   
      dbms_output.put_line('  !');
      execute immediate 'drop table ACCOUNT '; 
    end if;   
      execute immediate 'create table Account
                        (
                                AccountID nvarchar2(50) primary key,
                                AccountName nvarchar2(50) 
                        )';  
      dbms_output.put_line('     !');
end; 

MS SQL 이 표를 만 드 는 것 과 비교 하면 약간의 차이 가 있 지 않 습 니까?답 은 당연히 긍정 적 이다.이 프 리 젠 테 이 션 은 전주 입 니 다. 지금부터 오늘 의 주 제 를 시작 하 겠 습 니 다. Oracle 에서 표 생 성 에 성 공 했 습 니 다. 지금 은 이 표 에 데 이 터 를 삽입 하 겠 습 니 다. 새로 삽 입 된 데이터 가 표 에 존재 하면 수정 하고 존재 하지 않 으 면 삽 입 됩 니 다. 저 는 인터넷 에서 검색 해 보 니 Oracle 의 exists () 함수 가 두 데이터 집합 이 존재 하 는 지 여 부 를 판단 하 는 것 이 놀 라 웠 습 니 다.MS SQL 과 는 차이 가 있 습 니 다.이런 대 비 는 비록 전문 적 이지 않 지만 나 는 여전히 자신의 관점 을 비교 하고 발표 하 는 자유 가 있다.그래서 저 는 인터넷 에서 Oracle 이 이 문제 에 대한 해결 방안 을 미 친 듯 이 검색 하여 다음 과 같은 몇 가지 방안 을 정리 하여 여러분 이 선택 할 수 있 도록 했 습 니 다.
1: 스텔스 커서 SQL% NOTFOUND   SQL%FOUND
SQL% NOTFOUND 는 SQL 의 암시 적 커서 입 니 다. 삭제 하고 수정 할 때 자동 으로 열 립 니 다. 최소한 하나의 기록 이 영향 을 받 으 면 false 로 돌아 갑 니 다. 그러면 첫 번 째 해결 방안 을 교묘 하 게 구상 합 니 다.
begin
update account set AccountName = '  -a' where AccountID = '5';
IF SQL%NOTFOUND THEN
   insert into account(AccountID,AccountName) values('5','  -b');
END IF;
end;

먼저 유일한 ID 에 따라 데이터 시트 에 기록 을 수정 하고 이 기록 이 표 에 존재 하면 수정 하 며 SQL% NOTFOUND 는 false 로 돌아 갑 니 다.수 정 된 기록 이 존재 하지 않 으 면 SQL% NOTFOUND 는 true 로 돌아 가 삽입 문 구 를 실행 합 니 다.
2: 이상 법 DUPVAL_ON_INDEX
Oracle 문 구 를 실행 할 때 이상 exception 이 발생 하여 처리 합 니 다.
begin
insert into account(AccountID,AccountName) values('6','  -b');
exception 
when DUP_VAL_ON_INDEX then begin 
update account set AccountName = '  -b' where AccountID = '6';
end;
end;

표 에 데 이 터 를 삽입 하면 표 에 메 인 키 제약 이 있 기 때문에 삽 입 된 데이터 가 표 에 이미 존재 하면 이상 을 던 지고 이상 을 던 진 후에 수정 합 니 다.
3: 가상 표 법  dual
dual 은 가상 표 로 select 의 문법 규칙 을 구성 하 는 데 사용 되 며, Oacle 은 dual 안에 영원히 하나의 기록 만 있 음 을 보증 합 니 다.
declare t_count number;
begin
select count(*) into t_count from dual where exists(select 1 from account where AccountID='11');
if t_count< 1 then
  dbms_output.put_line('  ');
  insert into account(AccountID,AccountName) values('11','  -11');
else
  dbms_output.put_line('  ');
  update account set AccountName = '  -11' where AccountID = '11';
  end if;
end;

변수 tcount, 표 dual 표 의 값 부여 tcount, 이 값 이 1 보다 작 으 면 기록 이 존재 하지 않 음 을 표시 하고 삽입 작업 을 하 며, 반대로 존재 하면 수정 작업 을 합 니 다.
4:no_data_발견 법
삽입 할 기록 이 존재 하 는 지, 존재 하면 수정 하고, 존재 하지 않 으 면 삽입 합 니 다.구체 적 인 실현 은 다음 과 같다.
declare t_cols number;
begin
select AccountName into t_cols from account where AccountID = '8';
exception 
when no_data_found then begin 
   --dbms_output.put_line('  ');
   insert into account(AccountID,AccountName) values('8','  -8');
end;
when others then 
  begin
    --dbms_output.put_line('  ');
    update account set AccountName = '  -8' where AccountID = '8';
end;
end;

5: merge 법
먼저 merge 의 문법 을 살 펴 보 겠 습 니 다.
MERGE INTO table_name alias1   
USING (table|view|sub_query) alias2  
ON (join condition)   
WHEN MATCHED THEN   
    UPDATE table_name SET col1 = col_val1
WHEN NOT MATCHED THEN   
    INSERT (column_list) VALUES (column_values);

merge 의 문법 을 보고 그대로 모방 하 는 것 은 나 같은 표절 자 에 게 는 어 려 운 일이 아니다. 
merge into Account t1  
using (select '3' AccountID,'   ' AccountName from dual) t2  
on (t1.AccountID = t2.AccountID)  
when matched then  
     update set t1.AccountName = t2.AccountName
when not matched then  
     insert values (t2.AccountID, t2.AccountName);  
commit; 

이로써 내 가 제기 한 문 제 를 해결 하 는 다섯 가지 방법 을 소개 했다.문 제 는 작 지만 오 라 클 의 여러 지식 과 관련 이 있다.마지막 으로 당신 은 MS SQL 에 비해 용법 에 있어 서 큰 차이 가 있 습 니 다.이로써 어 진 사람 은 어 진 사람 을 보고 지혜 로 운 사람 은 지혜 로 운 사람 을 본다.
 만약 이 블 로그 가 당신 에 게 도움 이 된다 면 오른쪽 아래 의 [추천] 을 잊 지 마 세 요.  。

좋은 웹페이지 즐겨찾기