Oracle 커서 사용 실례 상세 설명
① 표 에서 결과 집 을 검색 하고 그 중에서 매번 하나의 기록 을 가리 키 며 상호작용 을 하 는 체 제 를 말한다.
② 관계 데이터베이스 에서 의 작업 은 완전한 줄 집합 에서 실 행 됩 니 다.
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 커서 분석 이 끝 났 습 니 다.한 마디 로 하면 커서 는 우리 가 데이터베이스 에서 추출 한 일부 데이터 일 뿐 이 고 우 리 는 이 결과 집합 에 대해 일련의 조작 을 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 작업 은 Clob 또는 NClob 데이터 형식의 저장 프로 세 스 인 스 턴 스 를 포함 합 니 다.텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.