从函数返回时复合数据类型缺失值

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. 这恰好匹配文字数组常量的语法,它们使用相同的大括号。该文字可以转换为 uuiduuid[] 类似:

'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;

【讨论】:

感谢您的帮助!

以上是关于从函数返回时复合数据类型缺失值的主要内容,如果未能解决你的问题,请参考以下文章

在用户定义的函数中返回列名而不是值 SQL

pandas使用read_csv函数读取文件时指定数据列的数据类型pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串

数据分析2 numpy(ndarray数组,属性,创建,索引切片,运算,函数,随机数), Pandas(Series创建,缺失值处理,特性,索引,DataFrame)

pandas数据类型判断数据判断

R语言数据对象类型

如何从函数返回数据类型 int** 并存储它?