2010-05-24 54 views
0

ICH在Postgres的功能相关的问题:Postgres的存储过程的问题

 

CREATE OR REPLACE FUNCTION getVar(id bigint) 
     RETURNS TABLE (repoid bigint, suf VARCHAR, nam VARCHAR) 

     AS $$ 
     declare rec record; 

     BEGIN 
      FOR rec IN 
     (WITH RECURSIVE children(repoobjectid,variant_of_object_fk, suffix, variantname) AS (
    SELECT repoobjectid, variant_of_object_fk, '' as suffix,variantname 
    FROM b2m.repoobject_tab 
    WHERE repoobjectid = id 
     UNION ALL 
    SELECT repo.repoobjectid, repo.variant_of_object_fk, suffix || '..' , repo.variantname 
    FROM b2m.repoobject_tab repo, children 
    WHERE children.repoobjectid = repo.variant_of_object_fk) 
     SELECT repoobjectid,suffix,variantname FROM children) 
      LOOP 

      RETURN next; 

      END LOOP; 

      RETURN; 

     END; 

它可以被编译,但是如果y尝试调用它

 
select * from getVar(18) 

我拿到8空行3列。

如果我执行程序的硬编码的ID参数以下部分:

 
WITH RECURSIVE children(repoobjectid,variant_of_object_fk, suffix, variantname) AS (
    SELECT repoobjectid, variant_of_object_fk, '' as suffix,variantname 
    FROM b2m.repoobject_tab 
    WHERE repoobjectid = 18 
     UNION ALL 
    SELECT repo.repoobjectid, repo.variant_of_object_fk, suffix || '..' , repo.variantname 
    FROM b2m.repoobject_tab repo, children 
    WHERE children.repoobjectid = repo.variant_of_object_fk) 
     SELECT repoobjectid,suffix,variantname FROM children 

我正好,我需要的8行数据:

 

repoobjectid suffix variantname 

18 
19   ..  for IPhone 
22   ..  for Nokia 
23   .... OS 1.0 

等。

什么问题?请帮忙。

Thanx提前

回答

1

我认为,如果你正在做的“返回表”,你需要做的“回归未来”之前分配给该表的“列”。所以像这样:

repoid := rec.repoid; 
suf := rec.suf; 
nam := rec.nam; 

就在你的“RETURN NEXT”之前。由于你没有分配这些,所以它们被返回为空。

1

这里是一个从表中返回行的funcion的示例代码,我认为这可能有所帮助。

首先,将样品表的示例数据:

CREATE TABLE sample_table (id smallint, description varchar, primary key (id)); 

INSERT INTO sample_table (id, description) VALUES (1, 'AAAA'); 
INSERT INTO sample_table (id, description) VALUES (2, 'BBBB'); 
INSERT INTO sample_table (id, description) VALUES (3, 'CCCC'); 
INSERT INTO sample_table (id, description) VALUES (4, 'DDDD'); 
INSERT INTO sample_table (id, description) VALUES (5, 'EEEE'); 

然后,描述行的字段返回类型返回:

CREATE TYPE return_type AS 
    (id smallint, 
    description varchar); 
ALTER TYPE return_type OWNER TO postgres; 

然后函数本身:

CREATE OR REPLACE FUNCTION report(p_id integer) 
    RETURNS SETOF return_type AS 
$BODY$ 
DECLARE 
    retorno return_type%ROWTYPE; 
BEGIN 
    FOR RETORNO IN SELECT * FROM sample_table WHERE id = p_id LOOP 
    RETURN NEXT RETORNO; 
    END LOOP; 
    RETURN; 
END 
$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE 
    COST 100 
    ROWS 1000; 
ALTER FUNCTION report(p_id integer) OWNER TO postgres; 

这里是函数调用:

SELECT * FROM report(1);