Oracle 에 수정 사항 이 존재 하고 삽입 기록 이 존재 하지 않 습 니 다.
18568 단어 Oacle
먼저 흔히 볼 수 있 는 개발 사례 를 말씀 드 리 겠 습 니 다. 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 에 비해 용법 에 있어 서 큰 차이 가 있 습 니 다.이로써 어 진 사람 은 어 진 사람 을 보고 지혜 로 운 사람 은 지혜 로 운 사람 을 본다.
만약 이 블 로그 가 당신 에 게 도움 이 된다 면 오른쪽 아래 의 [추천] 을 잊 지 마 세 요. 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
activemq 5.5 의 입문 은 설치, 시작, 데이터베이스 지속 화 를 포함한다Apache ActiveMQ 5.5.0 은 주로 유지보수 버 전 으로 130 개가 넘 는 문 제 를 복 구 했 으 며 대부분 bug 와 개선 이 었 다. Improved performance for offline d...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.