使用plpgsql过程提取一条记录(如果存在),然后提取一条记录(对它进行处理)。
变量是行类型:
my_var my_table%rowtype;
我用一条SQL语句填充它:
select * from my_table where owner_id = 6 into my_var;
我知道肯定有这样的行:
raise notice 'my_var is %', my_var;
返回值:
NOTICE: my_var is (383,6,10)
但是,现在我想测试一下,如果条件失败,它是否同时具有这些记录和记录:
if my_var is null then raise notice 'IT IS NULL'; end if; if my_var is not null then raise notice 'IT IS NOT NULL'; end if;
这些加薪都没有出现在我的消息日志中-它从未进入过障碍。测试您是否收到来自a的行的正确方法是SELECT * INTO什么?
SELECT * INTO
我看到两个可能的原因,为什么…
这些加薪都没有出现在我的消息日志中
首先,NOTICE通常不会使用默认设置将a写入数据库日志。我在这里引用手册:
NOTICE
log_min_messages(enum) 控制将哪些消息级别写入服务器日志。有效值为DEBUG5,DEBUG4,DEBUG3,DEBUG2,DEBUG1,INFO,NOTICE,WARNING,ERROR,LOG,FATAL,和PANIC。(…) 默认值为 WARNING 。请注意,LOG此处的排名与中的排名不同client_min_messages。
log_min_messages(enum)
log_min_messages
enum
控制将哪些消息级别写入服务器日志。有效值为DEBUG5,DEBUG4,DEBUG3,DEBUG2,DEBUG1,INFO,NOTICE,WARNING,ERROR,LOG,FATAL,和PANIC。(…) 默认值为 WARNING 。请注意,LOG此处的排名与中的排名不同client_min_messages。
DEBUG5
DEBUG4
DEBUG3
DEBUG2
DEBUG1
INFO
WARNING
ERROR
LOG
FATAL
PANIC
client_min_messages
大胆强调我的。还请注意(手册中的上一项NOTICE)不同的默认值(client_min_messages)。
其次,考虑如何对行表达式求值。当(且仅当) 每个元素 均为时,测试才row_variable IS NULL返回。给出以下示例:TRUE __NULL
row_variable IS NULL
TRUE
NULL
SELECT (1, NULL) IS NULL AS a -- FALSE ,(1, NULL) IS NOT NULL AS b -- also FALSE
这两个 表达式都返回FALSE。换句话说,行(或记录)变量(1, NULL)既不是NULL也不是NOT NULL。因此,您的两个测试均失败。
FALSE
(1, NULL)
NOT NULL
-> SQLfiddle, 有更多详细信息。
您甚至可以使用NULL(rec := NULL)分配记录变量,如果该类型是众所周知的行类型,则结果将使每个元素都为NULL。否则,我们将处理一个匿名记录,并且该结构是未定义的,因此您将无法访问任何元素。但是rowtype在您的示例中并非如此(始终是众所周知的)。
rec := NULL
rowtype
FOUND
测试您是否收到来自a的行的正确方法是SELECT * INTO什么?
您必须考虑到该行即使已分配也可能为NULL。该查询很可能已经返回了一堆NULL值(如果查询中的表定义允许NULL值)。这样的测试在设计上将是不可靠的。
有一种简单而安全的方法。使用GET DIAGNOSTICS ...或(如果适用)特殊变量FOUND:
GET DIAGNOSTICS ...
SELECT * FROM my_table WHERE owner_id = 6 INTO my_var; IF NOT FOUND THEN RAISE NOTICE 'Query did not return a row!'; END IF;
手册中的详细信息。