【发布时间】:2011-01-07 08:08:54
【问题描述】:
我最近开始使用 PostgreSQL,并且我正在尝试按照我的理解以“正确的方式”做事。这意味着将尽可能多的工作放在数据库服务器上,而不是放在客户端上。
所以我创建了一个带有 PL/pgSQL 的函数,它将向表中添加数据。由于我在该表上设置了主键约束,并且在我尝试添加新数据时引用的键可能不存在,我添加了一个异常捕获,它将创建键然后尝试插入再次新行。
这对我来说令人满意,但我很好奇我是否以“正确的方式”处理这个问题。我一直在尝试寻找某种设计这些用户定义函数的指南,但并没有真正找到任何有用的东西。
CREATE OR REPLACE FUNCTION add_product_price_promo_xml(v_product_code varchar, v_description varchar, v_product_group varchar,
v_mixmatch_id integer, v_price_at date, v_cost_price numeric, v_sales_price numeric,
v_tax_rate integer) RETURNS void AS $$
BEGIN
INSERT INTO product_prices (product_code , mixmatch_id , price_at , cost_price , sales_price , tax_rate) VALUES
(v_product_code, v_mixmatch_id, v_price_at, v_cost_price, v_sales_price, v_tax_rate);
EXCEPTION WHEN foreign_key_violation THEN
INSERT INTO products (code, description, product_group) VALUES (v_product_code, v_description, v_product_group);
PERFORM add_product_price_promo_xml($1, $2, $3, $4, $5, $6, $7, $8);
END;
$$ LANGUAGE plpgsql;
有问题的数据库将用于制作报告,并将每天导入完整的商品登记册,其中包含价格更新和新商品,但我不知道哪些商品是新的,哪些是旧的。
【问题讨论】:
标签: postgresql function user-defined-functions