使用以下存储功能,我想验证用户数据:
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 对象数组时调用它 -RAISE EXCEPTION如果它返回FALSE任何 JSON 对象(从而回滚整个事务),我将调用它。
我没有在此处转储我的第二个存储函数的源代码,而是在下面准备了 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可以在-statement中围绕check_user()调用...但是是否有更好的方法来解决这个问题?IF