我有光标代码:
BEGIN;
DECLARE cliente_cursor
CURSOR FOR SELECT * FROM cliente;
我想读取表“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();
该函数将持续存在,因此要么给它一个有用的名称并保留它,要么在完成后删除它。
如果您想要函数的私有(private)名称,pg_temp.foo
将对您的 session 私有(private)。
关于postgresql - 从游标 PostgreSQL 获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28005863/