PostgreSQL游标

时间:2011-12-24 10:47:08

标签: sql postgresql cursor

我正在尝试使用PostgreSQL学习基本游标。这是我的剧本:

DECLARE cur_employees CURSOR FOR
  SELECT *
  FROM   employee

CLOSE cur_employees 

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

2 个答案:

答案 0 :(得分:25)

你很少想在PostgreSQL中显式使用游标,即使在plpgsql中处理查询结果时也是如此。这与许多其他几乎一直使用它们的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语言处理程序处理打开,绑定,获取和关闭自身(更多关于declarationscontrol structures)。

使用9.0中的PostgreSQL,你可以直接使用“DO”块执行plpgsql。对于以前的版本,您需要创建一个函数并选择它。如果您正在寻找PostgreSQL等效的,例如,在SQL Server上使用游标迭代结果,就是这样。请注意,迭代等是SQL方言的一部分,只是plpgsql(或任何其他emebedded语言)的一部分。

SQL级别的“DECLARE CURSOR xxx”语法可以使用如下:

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

这可以用于仔细获取查询结果集的一部分。但是,使用它们并不常见,因为通常您的客户端驱动程序将提供某种功能来执行此操作(例如,JDBC中的可滚动结果集)。您也可以从类似于Oracle的函数返回游标,尽管这也是一个相对罕见的用例。

答案 1 :(得分:0)

通常,一个用于游标的DECLARE,然后是游标的OPEN(实现结果集),多个FETCH操作分别从结果集中检索行,然后一个执行游标的CLOSE。

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