2011-12-24 30 views
12

我想学习使用PostgreSQL的基本游标。这是我的脚本:PostgreSQL游标

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

我想遍历列表并输出那些活动的。我应该从哪里开始?

+1

首先添加一个WHERE子句,选择活动的子句。 – aib 2011-12-24 12:41:39

+2

阅读[手册中关于游标的章节](http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html)。 – 2011-12-24 14:01:37

+0

我照你说的我:DECLARE cur_employees CURSOR FOR SELECT * FROM员工 其中活跃= '主动' CLOSE cur_employees 但我收到以下错误: – Karl 2011-12-24 14:39:24

回答

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(或任何其他嵌入式语言)的一部分。

在SQL级别“声明CURSOR XXX”语法可以这样使用:

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

这可以用来仔细得到的只是查询结果集的一部分。然而,使用它们是不寻常的,因为通常你的客户端驱动程序会提供某种功能来完成这个功能(例如JDBC中的可滚动结果集)。您也可以从类似于Oracle的函数中返回游标,尽管这也是相当少见的用例。

+4

+1高质量的答案再次。 – 2011-12-27 16:55:49

+1

请记住,人们尝试使用cusors的90%以上会更好地处理基于集合的操作。你几乎不应该考虑循环数据集,除了有经验的dba以外,没有人应该考虑写一个游标。这是一种技术,除非你非常高级,并且知道何时适合,否则你不应该学习。如果您刚刚学习SQl,请跳过这个约十年。 – HLGEM 2015-02-09 22:17:06

0

通常,对游标有一个DECLARE,然后是游标的OPEN(实现结果集),多次FETCH操作以从结果集中单独检索行,然后执行光标的CLOSE 。

您似乎有一个DECLARE后跟一个CLOSE。因此,你的语法错误,因为你从来没有做过OPEN。

+0

Hm。 Karl没有提及他是想用SQL还是用pl/pgsql来使用游标。对于SQL,没有“OPEN”,因为这是由'DECLARE'隐式完成的。 – 2011-12-25 22:13:41