PostgreSQL游标

PostgreSQL游标,sql,postgresql,cursor,Sql,Postgresql,Cursor,我正在尝试使用PostgreSQL学习基本的游标。这是我的剧本: DECLARE cur_employees CURSOR FOR SELECT * FROM employee CLOSE cur_employees 我想遍历列表并输出那些活动的。我应该从哪里开始?通常,一个对游标进行声明,然后打开游标(具体化结果集),执行多个获取操作以分别从结果集中检索行,然后关闭游标 您似乎有一个DECLARE后跟一个CLOSE。因此,您的语法错误,因为您从未执行过OPEN。您很少希望在P

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

DECLARE cur_employees CURSOR FOR
  SELECT *
  FROM   employee

CLOSE cur_employees 

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

通常,一个对游标进行声明,然后打开游标(具体化结果集),执行多个获取操作以分别从结果集中检索行,然后关闭游标


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

您很少希望在PostgreSQL中显式使用游标,即使在plpgsql中处理查询结果时也是如此。这与许多其他几乎一直使用SQL数据库的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语言处理程序处理打开、绑定、获取和关闭自身(更多信息,和)

使用9.0版本的PostgreSQL,您可以简单地使用“DO”块执行plpgsql。对于以前的版本,您需要创建一个函数并选择它。例如,如果您正在寻找PostgreSQL等价物,即在SQL Server上使用光标迭代结果,那么就是这样。请注意,迭代等不是SQL方言的一部分,只是plpgsql(或任何其他嵌入语言)的一部分

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

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

这可以用来仔细地获取查询结果集的一部分。然而,使用这些是不寻常的,因为通常您的客户机驱动程序将提供某种功能(例如JDBC中的可滚动结果集)。您还可以从类似于Oracle的函数中返回游标,尽管这也是一个相对罕见的用例。

首先添加一个WHERE子句,选择活动的。阅读。我按照您告诉我的那样做了:声明cur_employees光标用于SELECT*FROM employees WHERE active='active'CLOSE cur_employees,但我收到以下错误:错误:语法错误在或接近“CLOSE”第6行:关闭当前员工^**********错误*******错误:在“关闭”SQL状态或其附近出现语法错误:42601@Karl:您的问题是针对SQL语言的游标还是pl/pgsql语言的游标?嗯,Karl没有提到他是想将游标与SQL一起使用还是与pl/pgsql一起使用。对于SQL,没有打开的
,因为这是由
声明的
隐式完成的。请记住,90%以上的用户尝试使用CUSOR进行的操作最好使用基于集合的操作来处理。实际上,你根本不应该考虑通过一个数据集,除了经验丰富的DBA之外,没有人应该考虑写一个游标。这是一个技巧,你不应该学习,直到你非常高级,知道什么时候是合适的。如果您只是在学习SQl,请将这篇文章跳过大约十年。我将进一步介绍有关使用游标的注释。如果您使用的是光标,则可能是做错了。SQL是建立在集合上的,DBMS是围绕集合进行优化的;它试图处理整个数据集,而你必须有一个非常好的理由强迫它一次处理一行。除了深奥的数据库维护案例,如果一行中的数据真正依赖于前一行中的值(可能是一个设计不好的表),您可能会考虑使用游标。否则,不懂SQL哲学的程序员可能会使用游标。