从游标PostgreSQL获取行

从游标PostgreSQL获取行,postgresql,cursor,Postgresql,Cursor,我有光标代码: BEGIN; DECLARE cliente_cursor CURSOR FOR SELECT * FROM cliente; 我想阅读“客户”表中的所有内容: 使用光标。 我有适用于SQL Server的代码: DECLARE cliente_cursor CURSOR FOR SELECT * FROM cliente OPEN cliente_cursor FETCH NEXT FROM cliente_cursor; While @@FETCH_STAT

我有光标代码:

BEGIN;
DECLARE cliente_cursor 
CURSOR FOR SELECT * FROM cliente;
我想阅读“客户”表中的所有内容:

使用光标。 我有适用于SQL Server的代码:

DECLARE cliente_cursor CURSOR
      FOR SELECT * FROM cliente
OPEN cliente_cursor
FETCH NEXT FROM cliente_cursor;
While @@FETCH_STATUS=0
BEGIN
     FETCH NEXT FROM cliente_cursor;
End
CLOSE cliente_cursor
DEALLOCATE cliente_cursor
我想要一个PostgreSQL的工作代码

我一直在寻找解决方案&人们通常建议使用函数。我想知道在这个PostgreSQL DBMS中是否有任何方法可以创建类似SQL Server中的代码

我编写了以下代码:

CREATE OR REPLACE FUNCTION MyFunction()
RETURNS setof cliente AS $$
DECLARE 
cursor_cliente CURSOR FOR SELECT * FROM cliente;
rec cliente%ROWTYPE;
 BEGIN
 OPEN cursor_cliente;
loop
--fetch the table row inside the loop
FETCH cursor_cliente INTO rec;
-- check if there is no record
   --exit from loop when record not found
   if not found then
        exit ;
   end if;
end loop;
RETURN;
END;
$$ LANGUAGE plpgsql;
但当我运行它时,我只得到:

select MyFunction();
你知道代码应该是什么吗

任何帮助都将不胜感激

CREATE OR REPLACE FUNCTION foo() RETURNS setof cliente 
   language plpgsql AS $$
DECLARE
  x cliente%rowtype ;
BEGIN 
  FOR x IN SELECT * FROM cliente loop
    RETURN NEXT x;
  END loop;
END $$;

SELECT * FROM foo();
它也可以通过显式游标来完成

CREATE OR REPLACE FUNCTION foo() RETURNS setof cliente
  language plpgsql as $$
DECLARE 
  x cliente%rowtype ;
  cliente_cursor CURSOR FOR SELECT * FROM cliente; 
BEGIN
  FOR x IN cliente_cursor loop
    RETURN NEXT x;
  END loop;
END $$;

SELECT * FROM foo();
该函数将持续存在,因此要么给它一个有用的名称并保留它,要么在完成后删除它


如果您想要函数的私有名称,
pg_temp.foo
将是会话的私有名称。

如果您只想返回查询中的所有行,请使用

RETURN QUERY
SELECT ...
并且
将表(column1 type1,column2 type2,…)
作为函数的类型返回

或对于游标:

RETURN QUERY
FETCH ALL FROM cliente_cursor;
FOR _record IN
  FETCH ALL FROM ...
LOOP
  <action1>;
  <action2>;
  ...
END LOOP;

要对每行执行某些操作,请使用

FOR _record IN
  SELECT ...
LOOP
  <action1>;
  <action2>;
  ...
END LOOP;
中的_记录
选择。。。
环

或对于游标:

RETURN QUERY
FETCH ALL FROM cliente_cursor;
FOR _record IN
  FETCH ALL FROM ...
LOOP
  <action1>;
  <action2>;
  ...
END LOOP;
中的_记录
全部从……取回。。。
环

)

我看不出你想要的与客户的
SELECT*有什么不同这可能是因为我不了解ms sql Server,它实际上是一样的。不同的是,我希望表格通过游标显示。那么使用for循环。为什么要使用游标?它所要做的就是减慢查询速度。内联plpgsql在与plpgsql函数相同的事务中运行。如何使用循环@Jasen?谢谢你的回答。我必须在PLPGSQL中使用游标来执行与sentencesAwesome&clear Explaution@Jasen的SQL server块相同的操作。谢谢你的快速帮助!