【发布时间】:2016-03-02 09:15:41
【问题描述】:
我想通过以下存储的函数来验证用户数据:
CREATE OR REPLACE FUNCTION check_user(
in_social integer,
in_sid varchar(255),
in_auth varchar(32))
RETURNS boolean AS
$func$
SELECT MD5('secret word' || in_social || in_sid) = in_auth;
$func$ LANGUAGE sql IMMUTABLE;
我将在另一个存储函数中循环访问 JSON 对象数组时调用它 - 如果它为任何 JSON 对象返回 FALSE,则将调用 RAISE EXCEPTION(从而回滚整个事务)。
我没有在此处转储我的第二个存储函数的源代码,而是在下面准备了 3 个简单的测试函数-
CREATE OR REPLACE FUNCTION test1() RETURNS void AS
$func$
BEGIN
IF NOT check_user(42, 'user1', '56db1046fa7b664c9b3d05bf7413552a') THEN
RAISE NOTICE 'invalid user';
ELSE
RAISE NOTICE 'valid user';
END IF;
END
$func$ LANGUAGE plpgsql;
第一个函数按预期工作并打印valid user。
CREATE OR REPLACE FUNCTION test2() RETURNS void AS
$func$
BEGIN
IF NOT check_user(42, 'user2', '56db1046fa7b664c9b3d05bf7413552a') THEN
RAISE NOTICE 'invalid user';
ELSE
RAISE NOTICE 'valid user';
END IF;
END
$func$ LANGUAGE plpgsql;
第二个函数按预期工作并打印invalid user。
CREATE OR REPLACE FUNCTION test3() RETURNS void AS
$func$
BEGIN
IF NOT check_user(42, 'user1', NULL) THEN
RAISE NOTICE 'invalid user';
ELSE
RAISE NOTICE 'valid user';
END IF;
END
$func$ LANGUAGE plpgsql;
第三个函数没有按预期工作并打印valid user。
这是因为 check_user() 返回 NULL 而不是布尔值。
COALESCE 可以包裹在check_user() 语句中的check_user() 调用中...但是是否有更好的方法来解决这个问题?
【问题讨论】:
标签: postgresql stored-procedures plpgsql coalesce postgresql-9.5