Я использую 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)
Как получилось?