首页 > 解决方案 > 函数返回空表

问题描述

我需要创建不同车站的火车返回时间表。我有类似的东西:

create or replace function f124(st varchar) returns table(odjazdy varchar, kierunek varchar, przewoznik varchar, peron varchar, tor int)
as
$$ declare s varchar; sta varchar:=st;
begin
drop table if exists f124p;
create table f124p(odjazdy varchar, kierunek varchar, przewoznik varchar, peron varchar, tor int);
select string_agg('insert into f124p select k."'||nr||'", ''stacja'', ''przewoznik'', t.peron, t.tor from gdymal_ic_kursy k inner join gdymal_ic_trasa t on k.stacja=t.stacja where t.stacja=''sta'';','') into s from generate_series(5110, 5118,2) as nr;
execute s;
return query select * from f124p;
end $$ language plpgsql;

问题是这个函数返回空表。它不应该是那样的,因为这个表中必须有一些信息。我认为 k 附近有问题。"'||nr||'" 插入应该将名为“5110”、“5112”的列中的数据作为 varchars 带入。(在 gdymal_ic_kursy 中有列“5110”、“5112”、...、“5118”)。也许这是一个问题。也许您有任何提示我应该如何修复此功能?

标签: postgresqlfunctionstring-aggregation

解决方案


我不知道它是什么意思,但它在这里工作:


\i tmp.sql

CREATE TABLE gdymal_ic_kursy
        ( stacja text
        , "5110" text
        , "5111" text
        , "5112" text
        , "5113" text
        , "5114" text
        , "5115" text
        , "5116" text
        , "5117" text
        , "5118" text
        );
INSERT INTO gdymal_ic_kursy VALUES ('sta', '1', '2', '3', '4', '5', '6', '7', '8');

CREATE TABLE gdymal_ic_trasa
        ( stacja text
        , peron text
        , tor integer
        );
INSERT INTO gdymal_ic_trasa(stacja,peron,tor) VALUES ('sta', 'one', 666 );

-- ------------------------------
create or replace function f124(st varchar)
    returns table(odjazdy varchar, kierunek varchar, przewoznik varchar, peron varchar, tor int)
as
$func$
declare s varchar; sta varchar := st;

begin

drop table if exists f124p;

create table f124p(odjazdy varchar, kierunek varchar, przewoznik varchar, peron varchar, tor int);

select string_agg('insert into f124p select k."'||nr||'", ''stacja'', ''przewoznik'', t.peron, t.tor
        from gdymal_ic_kursy k
        inner join gdymal_ic_trasa t on k.stacja=t.stacja
        where t.stacja=''sta'';','')
into s from generate_series(5110, 5118,2) as nr;

execute s;
return query select * from f124p;
end $func$ language plpgsql;

select *
FROM f124('OMG')
        ;

结果:


DROP SCHEMA
CREATE SCHEMA
SET
CREATE TABLE
INSERT 0 1
CREATE TABLE
INSERT 0 1
CREATE FUNCTION
NOTICE:  table "f124p" does not exist, skipping
 odjazdy | kierunek | przewoznik | peron | tor 
---------+----------+------------+-------+-----
 1       | stacja   | przewoznik | one   | 666
 3       | stacja   | przewoznik | one   | 666
 5       | stacja   | przewoznik | one   | 666
 7       | stacja   | przewoznik | one   | 666
         | stacja   | przewoznik | one   | 666
(5 rows)
                                               

推荐阅读