我正在尝试编写一个带有VARCHAR参数的PL/pgSQL函数,该参数应该是有限的。考虑以下函数,其中VARCHAR参数的大小限制为5个字符:
CREATE OR REPLACE FUNCTION do_nothin(v_value VARCHAR(5))
RETURNS TEXT AS
$$
DECLARE
BEGIN
RETURN v_value;
END;
$$
LANGUAGE plpgsql;
当我用大于5的文本调用这个函数时,它确实工作:
DO $$
DECLARE
BEGIN
PERFORM do_nothin('123456');
END;
$$
结果是“123456”,为什么呢?这应该给予我一个错误吧?
如果我这样定义一个varchar:
DO $$
DECLARE
v_mytext VARCHAR(5);
BEGIN
v_mytext := '123456';
END;
$$
它给了我一个预期的错误:
ERROR: value too long for type character varying(5) CONTEXT: PL/pgSQL function inline_code_block line 5 at assignment SQL state: 22001
我希望当函数有一个太大的参数时抛出这个错误,但是如何抛出呢?
2条答案
按热度按时间ivqmmu1c1#
由于历史原因,PostgreSQL忽略了函数参数类型(typmod)中的大小修饰符。有一些与实现相关的问题,简单而足够好的解决方案是忽略此类型功能-使用varchar的预期行为很简单,但对于数值类型设计正确和用户友好的行为可能相当困难。
你可以看到- typmod值不是持久的-然后没有效果。
如果你真的需要一些限制,那么你应该使用
domain type
:域是与all(typmods,checks)的持久类型同义词。
hgncfbus2#
根据文档“类型修饰符被
CREATE FUNCTION
丢弃”。