2011-12-24 5 views
12

PostgreSQL을 사용하여 기본 커서를 배우려고합니다. 이 스크립트는 내 스크립트입니다 :PostgreSQL 커서

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

목록을 탐색하여 활성화 된 스크립트를 출력하고 싶습니다. 어디에서 시작해야합니까?

+1

먼저 활성 항목을 선택하는 WHERE 절을 추가하십시오. – aib

+2

[매뉴얼의 커서에 관한 장] (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html)을 읽으십시오. –

+0

당신이 나에게로 내가했던 : 직원 FROM SELECT * 위한 cur_employees의 커서를 선언 할 경우 활성 = '활성' CLOSE의 cur_employees 그러나 나는 다음과 같은 오류가 무엇입니까 : 또는 근처에 "CLOSE 구문 오류 : – Karl

답변

24

plpgsql에서 쿼리 결과를 처리 할 때에도 거의 PostgreSQL에서 커서를 명시 적으로 사용하지 않는 것이 좋습니다. 이것은 거의 항상 사용되는 다른 많은 SQL 데이터베이스와 현저한 대조를 이룹니다.

plpgsql에서 간단히과 같이 쓸 수있다 : 상기에서

DECLARE 
    emp employee%rowtype; 
BEGIN 
    FOR emp IN SELECT * FROM employee LOOP 
    IF emp.active THEN 
     RAISE INFO 'Active: %', emp.employee_id 
    END IF; 
    END LOOP; 
END 

을 구멍에 plpgsql 언어 처리기 상품, 바인딩 가져 오는 자체를 폐쇄 (declarations에 더 많은, 그리고 control structures).

9.0의 PostgreSQL에서 "DO"블록을 사용하여 plpgsql을 실행하면됩니다. 이전 버전의 경우, 함수를 작성하여 선택해야합니다. 예를 들어 PostgreSQL에서 SQL Server에 커서를 사용하여 결과를 반복하는 경우와 동일합니다. 반복문은 이 아니며 SQL 방언의 일부인이 아니며 plpgsql (또는 다른 emebedded 언어 중 일부)의 일부일뿐입니다.

는 SQL 수준 에서 "커서 XXX 선언"구문은 다음과 같이 사용할 수 있습니다

DECLARE cur_employees CURSOR FOR SELECT * FROM employee; 
FETCH NEXT FROM cur_employees; 
// etc.. 
CLOSE cur_employees; 

이 조심스럽게 질의 결과 셋의 한 부분을 가져올 수 있습니다. 그러나 일반적으로 클라이언트 드라이버가이를 수행하는 일종의 기능 (예 : JDBC에서 스크롤 가능한 결과 세트)을 제공 할 것이기 때문에이 기능을 사용하는 것은 드문 경우입니다. 오라클과 비슷한 기능에서 커서를 반환 할 수도 있지만, 비교적 드문 유스 케이스입니다.

+4

+1 고품질 답변. –

+1

그리고 사람들이 cusors를 사용하려고 시도하는 것의 90 % 이상이 세트 기반 작업으로 더 잘 처리된다는 것을 기억하십시오. 데이터 세트를 통해 루핑하는 것을 거의 생각해서는 안되며 숙련 된 dba를 제외하고 커서를 작성하는 것을 고려해야합니다. 이것은 당신이 매우 노약자이고 적절한시기를 알기 전까지는 배우지 말아야 할 기술입니다. 방금 SQl을 배우는 중이라면 약 10 년 동안 건너 뛰십시오. – HLGEM

0

일반적으로 커서에는 DECLARE가 있고 커서 (결과 세트를 구체화)의 OPEN, 결과 세트에서 행을 개별적으로 검색하기위한 여러 FETCH 조작, 커서의 CLOSE 수행 .

DECLARE 다음에 CLOSE가있는 것 같습니다. 따라서 OPEN을 한 적이 없으므로 구문 오류가 발생합니다.

+0

흠에서만 사용할 수 있습니다. Karl은 SQL 또는 pl/pgsql을 사용하여 커서를 사용하고자하는지 언급하지 않았습니다.SQL의 경우 'DECLARE'에 의해 암시 적으로 수행되기 때문에 'OPEN'이 없습니다. –