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

问题描述 投票:0回答:1

当您输入错误的数据类型时,是否有人知道您是否可以创建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);
c# postgresql plpgsql
1个回答
0
投票

你不能在Postgres的TOP命令中触发外部异常。您可以将参数传递给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;

我不喜欢这种“无类型”功能 - 但它确实如此,你想要什么。

PostgreSQL的第二种类型不是变种类型,所以模式

IF some IS NOT smallint THEN -- has not sense

在PLpgSQL中是无稽之谈。你可以使用regexp,你可以使用numeric和测试限制,或者你可以转换为smallint并捕获异常。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.