2011-12-24 36 views
12

Tôi đang cố gắng tìm hiểu các con trỏ cơ bản bằng cách sử dụng PostgreSQL. Đây là tập lệnh của tôi:Con trỏ PostgreSQL

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

Tôi muốn duyệt qua danh sách và xuất những mục đang hoạt động. Tôi nên bắt đầu từ đâu?

+1

Bắt đầu bằng cách thêm mệnh đề WHERE để chọn mệnh đề đang hoạt động. – aib

+2

Đọc [chương về các con trỏ trong sách hướng dẫn] (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html). –

+0

tôi đã làm như bạn nói với tôi: DECLARE cur_employees CURSOR CHO SELECT * TỪ nhân viên nơi hoạt động = 'hoạt động' cur_employees CLOSE nhưng tôi đang nhận được lỗi sau: – Karl

Trả lời

24

Bạn rất hiếm khi muốn sử dụng con trỏ một cách rõ ràng trong PostgreSQL, ngay cả khi xử lý kết quả truy vấn trong plpgsql. Đây là một sự tương phản được đánh dấu từ nhiều cơ sở dữ liệu SQL khác, nơi chúng được sử dụng gần như mọi lúc.

Trong plpgsql bạn chỉ có thể viết một cái gì đó như:

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 

Ở phía trên, các giao dịch plpgsql xử lý ngôn ngữ với mở cửa, ràng buộc, lấy và đóng cửa tự (nhiều hơn về declarations, và control structures).

Với PostgreSQL từ 9.0, bạn có thể chỉ cần thả vào thực thi plpgsql bằng cách sử dụng khối "DO". Đối với các phiên bản trước, bạn cần tạo một hàm và chọn nó. Nếu bạn đang tìm kiếm tương đương PostgreSQL, ví dụ, lặp qua một kết quả với một con trỏ trên SQL Server, đó là những gì nó được. Lưu ý rằng lặp lại vv là không phải là một phần của phương ngữ SQL, chỉ là một phần của plpgsql (hoặc bất kỳ ngôn ngữ emebedded nào khác).

Các "DECLARE CURSOR xxx" cú pháp ở cấp SQL thể được sử dụng như thế này:

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

này có thể được sử dụng để cẩn thận có được chỉ là một phần của tập kết quả truy vấn. Tuy nhiên, nó không bình thường khi sử dụng chúng, vì thường trình điều khiển máy khách của bạn sẽ cung cấp một số chức năng để thực hiện điều này (ví dụ: các bộ kết quả có thể cuộn trong JDBC). Bạn cũng có thể trả lại con trỏ từ các hàm tương tự với Oracle, mặc dù một lần nữa đó là một trường hợp sử dụng tương đối hiếm.

+4

+1 Câu trả lời chất lượng cao một lần nữa. –

+1

Và hãy nhớ rằng 90 +% của những gì mọi người cố gắng sử dụng cusors cho sẽ được xử lý tốt hơn với các hoạt động dựa trên thiết lập. Bạn hầu như không bao giờ nghĩ đến việc lặp qua một tập dữ liệu và không ai ngoại trừ một dba kinh nghiệm nên cân nhắc việc viết một con trỏ. Đây là một kỹ thuật mà bạn không nên học cho đến khi bạn rất cao cấp và biết khi nào nó thích hợp. Nếu bạn chỉ học SQl, hãy bỏ qua bài này trong khoảng mười năm. – HLGEM

0

Nói chung, người ta có DECLARE cho con trỏ, sau đó là OPEN của con trỏ (hoạt hóa tập hợp kết quả), nhiều thao tác FETCH để truy xuất các hàng từ tập hợp kết quả riêng lẻ, và sau đó thực hiện một CLOSE của con trỏ .

Bạn dường như có DECLARE theo sau là ĐÓNG. Vì vậy, lỗi cú pháp của bạn, như bạn không bao giờ làm một OPEN.

+0

Hm. Karl đã không đề cập đến việc anh ta muốn sử dụng các con trỏ với SQL hay với pl/pgsql.Đối với SQL không có 'OPEN', bởi vì nó được thực hiện hoàn toàn bởi' DECLARE'. –