关于postgresql触发器函数的$ BODY $用于什么?

时间:2018-03-03 18:27:38

标签: sql postgresql database-trigger

我发现了一些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是否可以在其他地方使用?除LANGUAGECOSTALTER FUNCTION命令外,其他命令通常还在$BODY$之外?

1 个答案:

答案 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");
  }

}