创建RAISE EXCEPTION以验证postgresql中的数据类型

时间:2017-12-19 01:25:54

标签: c# postgresql plpgsql

当您输入错误的数据类型时,是否有人知道您是否可以创建一个ELEVATION EXCEPTION?例子显然它不起作用,但它是我正在寻找的一个例子

CREATE TABLE products(
  name_pr varchar(20),
  quantity smallint,
  price smallint,
  last_update timestamp,
  latest_user_bd text
);
CREATE OR REPLACE FUNCTION validate_products()
RETURNS TRIGGER AS
$BODY$
BEGIN

  IF NEW.price IS NOT SMALLINT THEN
     RAISE EXCEPTION 'You must enter the Price';
  END IF;

  NEW.last_update = now();
  NEW.latest_user_bd = user;
  RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER validate_products
BEFORE INSERT OR UPDATE
ON products
FOR EACH ROW EXECUTE PROCEDURE validate_products();

示例插入C#

string query = "INSERT INTO products(name_pr, quantity, price) VALUES('" + txtName.Text + "', '" + txtQuantity.Text + "','" + txtPrice.Text + "')";
con.Open();
comand = new NpgsqlCommand(query, con);

1 个答案:

答案 0 :(得分:0)

你不能在Postgres的TOP命令中触发外部异常。您可以将参数传递给PostgreSQL函数,在那里您可以在受保护的块中运行命令。在那里你可以处理异常。有些像

File "command line", line 1:
Error: Unbound module Pervasives

我不喜欢这种“无类型”功能 - 但它确实如此。

第二方面,PostgreSQL类型不是变体类型,因此模式

CREATE OR REPLACE FUNCTION new_product(__price text)
RETURNS void AS $$
DECLARE _price smallint;
BEGIN
  _price := __price::smallint;
  INSERT INTO product(..) (_price);
EXCEPTION WHEN invalid_text_representation, numeric_value_out_of_range THEN
  IF price IS NULL THEN
    RAISE EXCEPTION 'the price is not valid smallint value %', _price;
  END IF;
END;
$$ LANGUAGE plpgsql;

在PLpgSQL中是无稽之谈。你可以使用regexp,你可以使用IF some IS NOT smallint THEN -- has not sense 并测试限制,或者你可以转换为smallint并捕获异常。

PLpgSQL是严格类型的语言(PostgreSQL SQL也是如此),因此在那里不可能使用动态的类型较少的语言。

通常应首先在UI级别检查类型及其值 - 并且应该在SQL级别上安全地应用它们。 SQL级别会重新检查,但它可能引发一个常见的异常。参数检查是表示层的更好任务。