проблема хранимой процедуры postgres - PullRequest
0 голосов
/ 24 мая 2010

Ich есть проблема в функции 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;

 

Он может быть скомпилирован, но если вы попытаетесь вызвать его

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

и так далее.

Что не так? Пожалуйста, помогите.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Вот пример кода функции, которая возвращает строки из таблицы, я думаю, что это может помочь.

Сначала образец таблицы с образцами данных:

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);
1 голос
/ 24 мая 2010

Я думаю, что если вы делаете «возврат таблицы», вам нужно присвоить «столбцы» таблицы перед выполнением «возврат следующего».Так что-то вроде:

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

прямо перед вашим "ВОЗВРАЩЕНИЕ СЛЕДУЮЩИМ"Так как вы не назначаете их, они возвращаются как нулевые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...