Oracle 커서 사용 실례 상세 설명

7770 단어 Oacle유표
커서 가 무엇 입 니까?
① 표 에서 결과 집 을 검색 하고 그 중에서 매번 하나의 기록 을 가리 키 며 상호작용 을 하 는 체 제 를 말한다.
② 관계 데이터베이스 에서 의 작업 은 완전한 줄 집합 에서 실 행 됩 니 다.
SELECT 문 구 를 되 돌려 주 는 줄 집합 은 이 문 구 를 만족 시 키 는 WHERE 자구 가 열거 한 조건 을 만족 시 키 는 모든 줄 을 포함한다.이 문장 에서 완전한 줄 집합 을 되 돌려 주 는 것 을 결과 집합 이 라 고 한다.
응용 프로그램,특히 상호작용 과 온라인 응용 프로그램 은 완전한 결과 집합 을 하나의 단원 으로 처리 하 는 것 이 항상 효과 적 인 것 은 아니다.
이 프로그램 들 은 한 줄 또는 연속 적 인 몇 줄 을 처리 하 는 메커니즘 이 필요 하 다.커서 는 이 메커니즘 을 제공 하 는 결과 집합 에 대한 확장 이다.
커서 는 커서 라 이브 러 리 를 통 해 이 루어 진다.커서 라 이브 러 리 는 데이터베이스 시스템 이나 데이터 액세스 API 의 일부분 으로 자주 이 루어 지 는 소프트웨어 로 데이터 원본 에서 돌아 오 는 데이터 의 속성(결과 집합)을 관리 합 니 다.이러한 속성 은 병행 관리,결과 가 집 중 된 위치,되 돌아 오 는 줄 수,그리고 결과 가 집 중 된 앞 과/또는 뒤로 이동 할 수 있 는 지(스크롤 가능)를 포함한다.
커서 추적 결과 가 집 중 된 위 치 를 추적 하고 결과 집합 에 대해 여러 작업 을 수행 할 수 있 습 니 다.이 과정 에서 원시 표 로 돌아 갈 수도 있 고 원시 표 로 돌아 가지 않 을 수도 있 습 니 다.
다시 말 하면 커서 는 개념 적 으로 데이터 베 이 스 를 기반 으로 한 표 반환 결과 집합 이다.
결과 가 집 중 된 현재 위 치 를 표시 하기 때문에 컴퓨터 화면의 커서 가 현재 위 치 를 표시 하 는 것 처럼'커서'가 이름 을 얻 었 습 니 다.
커서 는 어떤 작용 을 합 니까?
① 지 정 된 결 과 는 특정한 줄 의 위치 에 집중 된다.
② 현재 결과 집합 위 치 를 바탕 으로 한 줄 또는 연속 적 인 몇 줄 을 검색 합 니 다.
③ 결과 집합 현재 위치 에서 줄 의 데 이 터 를 수정 합 니 다.
④ 다른 사용자 가 한 데이터 변경 에 대해 서로 다른 민감 성 단 계 를 정의 한다.
⑤ 데이터 베 이 스 를 프로 그래 밍 방식 으로 접근 할 수 있다.
머리말
이 절 은 Oracle 의 커서 에 대해 상세 하 게 설명 합 니 다.이 절 에서 들 은 인 스 턴 스 원본 Oracle 에서 scott 사용자 의 emp 표 dept 표:

1.커서:
1.개념:
커서 의 본질은 결과 집합 resultset 로 데이터베이스 에서 추출 한 데이터 블록 을 저장 합 니 다.
2.커서 의 분류:
1.명시 적 커서:
사용자 정의 에 따라 필요 한 작업:커서 를 정의 하고 커서 를 열 며 데 이 터 를 추출 하고 커서 를 닫 습 니 다.주로 검색 어 를 처리 하 는 데 사 용 됩 니 다.
속성:%FOUND%NOTFUND%ISOPEN%ROWCOUNT
Example:emp 표를 인쇄 한 직원 정보

DECLARE
 CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
 v_empno emp.empno%TYPE;
 v_name emp.ename%TYPE;
 v_job emp.job%TYPE;
BEGIN
 OPEN emp_cursor;
 LOOP
 FETCH emp_cursor INTO v_empno,v_name,v_job;
 DBMS_OUTPUT.PUT_LINE('    :'||v_empno||'   '||v_name||'  :'||v_job);
 EXIT WHEN emp_cursor%NOTFOUND;
 END LOOP;
 CLOSE emp_cursor;
END;

여 기 는 커서 를 표시 하 는 쓰기 규칙 에 엄 격 히 따 릅 니 다:DECLARE emp커서 정의 커서 OPEN emp커서 커서 열기 FETCH empcursor INTO...추출 데이터 닫 기 empcursor 에서 커서 를 닫 습 니 다.추출 한 데 이 터 는 여러 줄 에 속 하기 때문에 loop 순환 으로 인쇄 하면 됩 니 다.
예 2:커서 가 열 렸 는 지 확인 하고 열 면 추출 줄 수 를 표시 합 니 다.

DECLARE
 CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
 v_empno emp.empno%TYPE;
 v_name emp.ename%TYPE;
 v_job emp.job%TYPE;
BEGIN
 OPEN emp_cursor;
 LOOP
  FETCH emp_cursor INTO v_empno,v_name,v_job;
  EXIT WHEN emp_cursor%NOTFOUND;
 END LOOP;
 IF emp_cursor%ISOPEN THEN
 DBMS_OUTPUT.PUT_LINE('     ');
 DBMS_OUTPUT.PUT_LINE('   '||emp_cursor%ROWCOUNT||' ');
 ELSE
 DBMS_OUTPUT.PUT_LINE('      ');
 END IF; 
 CLOSE emp_cursor;
END;

%ISOPEN 속성 을 통 해 커서 가 열 렸 는 지,%ROWCOUNT 가 줄 수 를 판단 합 니 다.
2.암시 적 커서:시스템 에서 정의 하고 작업 영역 을 만 들 고 암시 적 정 의 를 열 어 추출 을 닫 습 니 다.암시 적 커서 의 커서 이름 은'SQL'입 니 다.속성 은 커서 를 표시 하 는 것 과 같 고 주로 한 줄 의 selection 구문 이나 dml 작업 을 처리 하 는 데 사 용 됩 니 다.Example:사용자 가 직원 번 호 를 입력 하여 직원 의 월급 을 수정 하고 성공 하면 출력 성공 표 지 를 출력 합 니 다.
원본 시 계 를 최대한 바 꾸 지 않 기 위해 새 시 계 를 만 듭 니 다 empnew 는 원래 표 데이터 와 같 습 니 다:

CREATE TABLE emp_new
AS
SELECT * FROM emp;

BEGIN
 UPDATE emp_new SET sal = sal+500 WHERE empno=&empno;
 IF SQL%FOUND THEN
 DBMS_OUTPUT.PUT_LINE('    ');
 COMMIT;
 ELSE
 DBMS_OUTPUT.PUT_LINE('    ');
 ROLLBACK;
 END IF;
END;


추가 삭제 수정 후 작업 에 대해 commt 제출 을 해 야 합 니 다.작업 에 실패 하면 rollback 에서 방금 작업 을 다시 시작 합 니 다.
3.매개 변수 커서:
커서 를 정의 할 때 인자 의 커서 를 추가 하면 커서 for 순환 에 맞 춰 필요 한 데 이 터 를 신속하게 찾 을 수 있 습 니 다.여기 서 먼저 커서 for 순환 을 말씀 드 리 겠 습 니 다.
A.커서 FOR 순환:
추출 을 열 고 닫 는 데 이 터 를 은밀히 실 행 했 습 니 다.코드 가 많이 간소화 되 었 습 니 다.Expression:
FOR table_record IN table_cursor LOOP
  STATEMENT;
END LOOP;
예:커서 를 사용 하여 출력 직원 정 보 를 반복 적 으로 출력 합 니 다.

DECLARE
CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
BEGIN
 FOR emp_record IN emp_cursor LOOP
 DBMS_OUTPUT.PUT_LINE('   :'||emp_record.empno||'    '||emp_record.ename||'    '||emp_record.job);
 END LOOP;
END;

여기 서 커서 FOR 순환 은 가 져 온 데이터 에 대한 변수의 이름과 할당 을 줄 이 고 모든 인쇄 를 하면 순환 조건 을 쓰 지 않 아 도 되 며 코드 가 많이 간소화 되 었 습 니 다.
코드 를 더욱 간소화 하려 면 커서 에 대한 성명 을 삭제 하고 하위 조 회 를 도입 하면 됩 니 다.다음 과 같 습 니 다.

BEGIN
 FOR emp_record IN (SELECT empno,ename,job FROM emp) LOOP
 DBMS_OUTPUT.PUT_LINE('   :'||emp_record.empno||'    '||emp_record.ename||'    '||emp_record.job);
 END LOOP;
END;
코드 가 더욱 간소화 되 어 얻 은 결 과 는 같다.암시 적 커서 와 비슷 하지 않 습 니까?그러나 암시 적 커서 는 주로 단일 줄 select 와 dml 문장의 조작 에 사용 되 며 2 자 용법 의 차 이 를 주의 하 십시오.
다음 매개 변수 커서 의 인 스 턴 스 를 계속 합 니 다:
예:부서 번 호 를 입력 하여 직원 정 보 를 인쇄 합 니 다.

DECLARE
CURSOR emp_cursor(dno NUMBER)IS SELECT empno,ename,job FROM emp WHERE deptno=dno;
BEGIN
 FOR emp_record IN emp_cursor(&dno) LOOP
 DBMS_OUTPUT.PUT_LINE('   '||emp_record.empno||'  '||emp_record.ename||'  '||emp_record.job);
 END LOOP;
END;


여기에 인자 가 있 는 이상 커서 에 대한 설명 이 있 을 수 밖 에 없습니다.커서 FOR 순환 과 결합 하여 필요 한 데 이 터 를 빠르게 찾 고 있 습 니 다.
3.커서 를 사용 하여 데 이 터 를 수정 하 는 주의사항
1.커서 를 사용 하여 데 이 터 를 수정 할 때 다른 사람 이 데 이 터 를 조작 할 때 데 이 터 를 수정 하 는 것 을 방지 하기 위해 Oacle 은 for update 자 구 를 제공 합 니 다.
동시에 update 나 delete 를 사용 할 때 where current of+name 을 사용 해 야 합 니 다.cursor 문장,그리고 마지막 에 제출 하 십시오.직렬 연결 작업 이 라면 for update of 를 사용 하여 관련 표 의 잠 금 을 추가 할 수 있 습 니 다.
Example 1:직위 가 PRESIDENT 인 직원 에 게 는 1000 임금 을 올 리 고 MANAGER 인 사람 에 게 는 500 임금 을 올 립 니 다.

CREATE TABLE emp_new
AS
SELECT * FROM emp;

DECLARE
CURSOR empnew_cursor IS SELECT ename,job FROM emp_new FOR UPDATE;
BEGIN
 FOR empnew_record IN empnew_cursor LOOP
 DBMS_OUTPUT.PUT_LINE('  '||empnew_record.ename||'  '||empnew_record.job);
 IF empnew_record.job='PRESIDENT' THEN
  UPDATE emp_new SET sal=sal+1000 WHERE CURRENT OF empnew_cursor;
 ELSIF empnew_record.job='MANAGER' THEN
  UPDATE emp_new SET sal=sal+500 WHERE CURRENT OF empnew_cursor;
 END IF;
 END LOOP;
 COMMIT;
END;


여기 서 월급 에 상응하는 변화 가 생 긴 것 을 볼 수 있다.이로써 Oracle 커서 분석 이 끝 났 습 니 다.한 마디 로 하면 커서 는 우리 가 데이터베이스 에서 추출 한 일부 데이터 일 뿐 이 고 우 리 는 이 결과 집합 에 대해 일련의 조작 을 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기