2015-10-29 55 views
0

我想通过游标(plpgsql)结果循环,但不知何故在输出控制台上没有打印任何东西。循环游标结果

create or replace function curs() returns refcursor as 
$body$ 
declare 
    curs cursor for select id from stores; 
    store stores.id%TYPE; 
begin 
    open curs; 
    fetch curs into store; 
    loop 
    exit when not found; 
     raise notice 'Value: %',store; 
    end loop; 
    close curs; 
end 
$body$ language plpgsql; 

select curs(); 

如何实现一个合适的循环?

数据库版本:9.0 表的列ID,名称

+0

这个问题也应该提供表格定义和你的Postgres版本。 –

+0

@ErwinBrandstetter更新了问题 – Pradeep

+0

但这不是表格定义。表定义是一个完整的'CREATE TABLE'脚本,显示数据类型和约束,或者你在psql中使用'\ d tbl'获得的内容。 –

回答

1

首先,你的功能不回报什么,你只是生产通知。在pgAdmin中,这些将在“消息”窗格中输出,而不是在“数据输出”窗格中输出。

我假设你想要实际返回值...
但通常,你不需要明确的游标循环。使用更方便光标FOR循环:

CREATE OR REPLACE FUNCTION test_loop() 
    RETURNS SETOF int AS 
$func$ 
DECLARE 
    _id int; -- assuming data type integer 
BEGIN 
    FOR _id IN 
     SELECT id FROM stores ORDER BY id 
    LOOP 
     RETURN NEXT _id; 
    END LOOP; 
END 
$func$ LANGUAGE plpgsql; 

注意调用语法:

SELECT * FROM test_loop(); 

通常情况下,你甚至不需要一个循环。只是简单的SQL ...

CREATE OR REPLACE FUNCTION test_loop1() 
    RETURNS SETOF int AS 
$func$ 
BEGIN 
    RETURN QUERY 
    SELECT id FROM stores ORDER BY id; 
END 
$func$ LANGUAGE plpgsql; 

这可以简化为一个SQL函数:

CREATE OR REPLACE FUNCTION test_loop2() 
    RETURNS SETOF int AS 
$func$ 
    SELECT id FROM stores ORDER BY id; 
$func$ LANGUAGE sql; 

相关答案更多的细节和解释:

+0

是的。第一个例子有效。 但是如果我不想使用循环呢? 我怎样才能单独读取值并返回它们? – Pradeep