Окончательное утверждение возвращает символ вместо изменяющегося символа - PullRequest
0 голосов
/ 30 октября 2018

Я использую PostgreSQL 10.5 в Azure. Я хочу создать хранимую процедуру, которая возвращает набор строк, поэтому я копирую типы выбранных данных из сценария установки:

DROP TYPE t CASCADE;
CREATE TYPE t as (region varchar(24), county varchar(50), year int, value int);
DROP FUNCTION geo();
CREATE FUNCTION geo()
returns setof t language sql as $$
SELECT
region.name, county.name, tbl.year, tbl.value
FROM tbl
LEFT JOIN county ON tbl.lau1 = county.lau1
LEFT JOIN region ON county.regionid = region.regionid
$$;

Я получаю ошибку:

ERROR:  return type mismatch in function declared to return t
DETAIL:  Final statement returns character instead of character varying at column 1.
CONTEXT:  SQL function "geo"

Тем не менее, типы такие же, как и при создании таблиц region и county (и я также включаю код для tbl):

CREATE TABLE county (

    LAU1    CHAR(9),
    NAME    VARCHAR(50) NOT NULL,
    REGIONID    INT NOT NULL,
    PRIMARY KEY(LAU1)
);

CREATE TABLE region (
    REGIONID    SMALLINT,
    NAME        VARCHAR(24) NOT NULL,
    PRIMARY KEY(REGIONID)
);

CREATE TABLE tbl (
    LAU1        CHAR(9),
    YEAR        INT,
    VALUE       INT,
    PRIMARY KEY(LAU1, YEAR)
);

Образец из трех таблиц:

=> select * from county limit 2;
   lau1    |   name    | regionid 
-----------+-----------+----------
 E06000015 | Derby     |        4
 E06000016 | Leicester |        4
(2 rows)

=> select * from region limit 2;
 regionid |           name           
----------+--------------------------
        1 | North East              
        2 | North West              
(2 rows)

=> select * from tbl limit 2;
   lau1    | year | value 
-----------+------+-------
 E06000047 | 1997 |  3241
 E06000005 | 1997 |   656
(2 rows)

Я бы хотел сохранить в возвращаемых значениях тот же тип, что и исходный тип varchar. Но в качестве эксперимента, если я изменю первый тип кортежа с varchar на char:

CREATE TYPE t as (region char(24), county varchar(50), year int, value int);

и остальной код, как и раньше, затем он работает, несмотря на то, что во втором столбце сохраняется varchar!

select * from geo();
          region          |   county   | year | value 
--------------------------+------------+------+-------
 North East               | Hartlepool | 1997 |   625
(1 row)

Как получилось?

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