从函数返回时复合数据类型缺失值
Posted
技术标签:
【中文标题】从函数返回时复合数据类型缺失值【英文标题】:Composite data type missing value when returned from function 【发布时间】:2014-03-04 18:07:19 【问题描述】:我有一个函数返回 setof
复合数据类型。当我运行该函数时,复合数据类型中定义的两列中只有一列中有数据。在对问题进行故障排除时,我对复合数据类型执行了RAISE NOTICE
,它的列中的数据在结果集中缺少数据。我在RETURN NEXT
之前和之后都进行了测试。我正在使用 PostgreSQL 9.2。
知道为什么结果集缺少数据吗?
CREATE TYPE map_data AS (lid uuid, tile_ids uuid [] );
CREATE OR REPLACE FUNCTION get_map_data(mid_val uuid) RETURNS SETOF map_data AS $$
DECLARE
j uuid;
b uuid;
m map_data%rowtype;
tid uuid []; --tile ids
BEGIN
FOR j IN
SELECT lid FROM map_layers WHERE "mid" = mid_val
LOOP
FOREACH b IN ARRAY (SELECT tiles FROM layer_tiles WHERE lid = j)
LOOP
tid := array_append(tid,b);
END LOOP;
SELECT j, tid INTO m;
RETURN NEXT m;
tid := ''; --clear the array.
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
你是如何调用函数的? 【参考方案1】:确保你像这样调用函数:
SELECT * FROM get_map_data( ... );
不是这样的:
SELECT get_map_data( ... );
或者您将整个复合类型作为单个列。
可能的解释
UUIDs can be written with enclosing curly braces () in text representation. 这恰好匹配文字数组常量的语法,它们使用相同的大括号。该文字可以转换为
uuid
和 uuid[]
类似:
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
这可能会引入歧义。只是推测,但我可以想象一些客户对语法规则感到困惑,并将元素和数组连接到单个数据。
即使这个SQL Fiddle 也会遇到 JDBC 错误! (虽然同样适用于整数数据。)
更好的选择
不管怎样,你的函数中有很多无意义的努力。循环、取消嵌套和重新构建数组,... 整个 shebang 都可以替换为这个简单且速度更快的查询:
SELECT m.lid, tiles
FROM map_layers m
JOIN layer_tiles l USING (lid)
WHERE m.mid = $mid_val;
如果需要,将其包装到 SQL 函数中:
CREATE OR REPLACE FUNCTION get_map_data(_mid_val uuid)
RETURNS SETOF map_data AS
$func$
SELECT m.lid, l.tiles
FROM map_layers m
JOIN layer_tiles l USING (lid)
WHERE m.mid = $1
$func$ LANGUAGE sql;
【讨论】:
感谢您的帮助!以上是关于从函数返回时复合数据类型缺失值的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用read_csv函数读取文件时指定数据列的数据类型pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串
数据分析2 numpy(ndarray数组,属性,创建,索引切片,运算,函数,随机数), Pandas(Series创建,缺失值处理,特性,索引,DataFrame)