0

我对 postgresql 比较陌生,并且正在努力熟悉它。我在编写新的 pl/sql 函数时遇到了错误。错误:类型“ordered_pa​​rts”不存在

CREATE OR REPLACE FUNCTION get_ordered_parts(var_bill_to integer)
  RETURNS SETOF ordered_parts AS
$BODY$
declare

    var_ordered_id record;
    var_part ordered_parts;

begin

    for var_ordered in select order_id from view_orders where bill_to = var_bill_to
    loop

        for var_part select os.po_num,os.received,os.customer_note,orders.part_num,orders.description,orders.order_id,orders.remaining_quantity from (select vli.part_num,vli.description,vli.order_id,vli.quantity - vli.quantity_shipped as remaining_quantity from view_line_items as vli where vli.order_id in (select order_id from view_orders where bill_to = var_bill_to and order_id = var_ordered.order_id) and vli.quantity - vli.quantity_shipped > 0)as orders left join order_sales as os on orders.order_id = os.order_id
        then

            -- Then we've found a leaf part
            return next var_part;

        end if;

    end loop;

end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION get_ordered_parts(integer) OWNER TO postgres;
4

2 回答 2

2

请注意-您的代码是永远不要编写存储过程的完美示例。对于一些较长的结果,它可能会非常慢。至少可以将两个循环连接到一个,或者更好的是,您可以只使用一个 RETURN QUERY 语句。下一个问题是嵌入式 SQL 的零格式 - 行的长度在 70 到 100 个字符之间 - 将长 SQL 语句写入一行以实现零可读性和可维护性代码。

关系数据库不是数组,任何查询都有一定的成本,所以如果你真的不需要,不要使用嵌套的FOR。我很抱歉跑题了。

于 2013-05-29T19:40:21.570 回答
1

错误消息告诉您,您已将函数的返回类型声明为SETOF ordered_parts,但它不知道是什么类型的东西ordered_parts。在您的Declare块中,您还拥有一个声明为相同类型的变量 ( var_part ordered_parts)。

如果您有一个名为 的表或视图ordered_parts,那么它的“行类型”将自动创建为一种类型,但这里不是这种情况。如果您只想使用结果集中的任意行,则可以使用泛型类型record

所以在这种情况下,你的函数应该说RETURNS SETOF record,和你的Declarevar_part record

额外提示:与其循环查询结果并RETURN NEXT在每一行上运行,RETURN QUERY不如一次性将整个结果集放入返回的集合中。请参阅此 Postgres 手册页

于 2013-05-29T18:21:31.287 回答