为什么在我的 Postgres 函数中使用 IF 语句时会出现语法错误?
Why am I getting a syntax error when using an IF statement in my Postgres function?
我正在创建一个函数,允许我有条件地更新 table 中的特定列。但是,当我尝试 运行 以下代码时,我收到一条错误消息,指出“IF”处或附近存在语法错误。我对 Postgres 有点陌生,所以很有可能。我无法理解 Postgres 中的一些 concept/syntax 东西。有人可以帮我指出我一定犯的错误吗?
CREATE OR REPLACE FUNCTION profiles.do_something(
p_id UUID,
p_condition1 BOOLEAN,
p_condition2 BOOLEAN,
p_condition3 BOOLEAN
)
RETURNS void AS $$
BEGIN
IF p_condition1 IS TRUE THEN
UPDATE tablename SET column1 = null WHERE member_id = p_id;
END IF;
IF p_condition2 IS TRUE THEN
UPDATE tablename SET column2 = null WHERE member_id = p_id;
END IF;
IF p_condition3 IS TRUE THEN
UPDATE tablename SET column3 = null WHERE member_id = p_id;
END IF;
END;
$$ LANGUAGE 'sql';
tl;dr $$ LANGUAGE 'plpgsql'
$$ LANGUAGE 'sql';
^^^^^
你告诉它把函数体解析为 sql
。在SQL中,begin
是一条启动事务的语句。
create or replace function test1()
returns void
language sql
as $$
-- In SQL, begin starts a transaction.
-- note the ; to end the statement.
begin;
-- Do some valid SQL.
select 1;
-- In SQL, end ends the transaction.
end;
$$;
在 SQL 中你写了 begin if ...
这是一个语法错误。
您使用的语言是plpgsql
。在 plpgsql 中,begin
是开始一个块的关键字。
create or replace function test1()
returns void
language plpgsql
as $$
-- In PL/pgSQL, begin starts a block
-- note the lack of ;
begin
-- Do some valid SQL.
select 1;
-- In PL/pgSQL, end ends the block
end;
$$;
我正在创建一个函数,允许我有条件地更新 table 中的特定列。但是,当我尝试 运行 以下代码时,我收到一条错误消息,指出“IF”处或附近存在语法错误。我对 Postgres 有点陌生,所以很有可能。我无法理解 Postgres 中的一些 concept/syntax 东西。有人可以帮我指出我一定犯的错误吗?
CREATE OR REPLACE FUNCTION profiles.do_something(
p_id UUID,
p_condition1 BOOLEAN,
p_condition2 BOOLEAN,
p_condition3 BOOLEAN
)
RETURNS void AS $$
BEGIN
IF p_condition1 IS TRUE THEN
UPDATE tablename SET column1 = null WHERE member_id = p_id;
END IF;
IF p_condition2 IS TRUE THEN
UPDATE tablename SET column2 = null WHERE member_id = p_id;
END IF;
IF p_condition3 IS TRUE THEN
UPDATE tablename SET column3 = null WHERE member_id = p_id;
END IF;
END;
$$ LANGUAGE 'sql';
tl;dr $$ LANGUAGE 'plpgsql'
$$ LANGUAGE 'sql';
^^^^^
你告诉它把函数体解析为 sql
。在SQL中,begin
是一条启动事务的语句。
create or replace function test1()
returns void
language sql
as $$
-- In SQL, begin starts a transaction.
-- note the ; to end the statement.
begin;
-- Do some valid SQL.
select 1;
-- In SQL, end ends the transaction.
end;
$$;
在 SQL 中你写了 begin if ...
这是一个语法错误。
您使用的语言是plpgsql
。在 plpgsql 中,begin
是开始一个块的关键字。
create or replace function test1()
returns void
language plpgsql
as $$
-- In PL/pgSQL, begin starts a block
-- note the lack of ;
begin
-- Do some valid SQL.
select 1;
-- In PL/pgSQL, end ends the block
end;
$$;