我发现了一些postgresql触发器教程。有这个示例函数:
CREATE OR REPLACE FUNCTION add_log_trigg_function() RETURNS trigger AS
$BODY$
DECLARE
account_type varchar;
BEGIN
IF (TG_TABLE_NAME = 'account_current') THEN
account_type := 'Current';
RAISE NOTICE 'TRIGER called on %', TG_TABLE_NAME;
ELSIF (TG_TABLE_NAME = 'account_savings') THEN
account_type := 'Savings';
RAISE NOTICE 'TRIGER called on %', TG_TABLE_NAME;
END IF;
RETURN null;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION add_log_trigg_function()
OWNER TO postgres;
我知道$BODY$
启动了身体功能。但为什么它应该命名?此名称BODY
是否可以在其他地方使用?除LANGUAGE
,COST
和ALTER FUNCTION
命令外,其他命令通常还在$BODY$
之外?
答案 0 :(得分:4)
https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING
美元引用的字符串常量由美元符号($)组成 零个或多个字符的可选“标记”,另一个美元符号,一个 构成字符串内容的任意字符序列,a 美元符号,开始这个美元报价的标签,和一美元 登录。
简而言之 - 您可以放置任何标记 - 不只是BODY
来自function
来代替\sf
t=# do
$anything$
begin
raise info '%', 'any tag would work';
end;
$anything$
;
INFO: any tag would work
DO
,因为psql通常会格式化它。样品:
$$
还要回答任何应该命名的内容 - 它不应该.jut $BODY$
和raise
一样好,但是当你需要在引用中使用引用时,“命名”非常有用。就像我在上面的示例中一样,我使用t=# do
$anything$
begin
raise info $$%$$, $someothertag$any tag would work$someothertag$;
end;
$anything$
;
INFO: any tag would work
DO
引用单引号,并且我不需要双引号或将它们转义为在体内使用,因为我已经使用美元符号引用。可能更清晰的样本是:
#include <dht.h>
dht DHT;
#define DHT11_PIN 7
int prev;
int val;
void setup(){
Serial.begin(9600);
}
void loop()
{
prev = val;
int chk = DHT.read11(DHT11_PIN);
Serial.print("Temperature = ");
val = DHT.temperature;
Serial.println(val);
delay(100);
if (val - prev > 2) {
Serial.println("HOT");
}
}