sql - 写函数时PostgreSQL sql函数语法错误

标签 sql postgresql stored-procedures sql-update

我正在尝试编写一个 Postgres 函数。我是第一次这样做,所以如果您发现一些愚蠢的错误,请不要生气:

CREATE  FUNCTION proc_test(userId int)
returns void 
begin
UPDATE pl_payroll SET remarks =viw.remarks from pl_payroll   
diff,viwPayDifference viw 
where diff.userid = cast(userId as varchar); 
end;

它给出了类似

的错误

syntax error at or near "begin"

这里有什么问题吗?

最佳答案

SQL functions没有像 plpgsql functions 这样的 BEGINEND .

CREATE FUNCTION proc_test(userId int)
  RETURNS void AS
$func$
UPDATE pl_payroll
SET    remarks = viw.remarks
FROM   pl_payroll diff, viwPayDifference viw
WHERE  diff.userid = cast(userId as varchar);
$func$ LANGUAGE sql;

您的 UPDATE 本身也看起来错误

  • 没有 WHERE 条件将 pl_payroll 连接到附加表。
  • 您不需要第二次加入 pl_payroll
  • userId 的第二次出现不是表限定的,可能不明确。

查看 UPDATE syntax in the manual .应该是这样的:

CREATE FUNCTION proc_test(userId int)
  RETURNS void AS
$func$
UPDATE pl_payroll p
SET    remarks = viw.remarks
FROM   viwPayDifference viw
WHERE  viw.userid = p.userId::varchar;
$func$ LANGUAGE sql;

顺便说一句:您必须将 diff.userId 转换为 varchar 看起来非常可疑。您的基表中的数据类型有问题吗?

关于sql - 写函数时PostgreSQL sql函数语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14066203/

相关文章:

mysql - SQL 问题 - 如何选择包含第二个表中所有引用的所有元组?

performance - 如何使用关系查询/类似 Tinder 的后端系统来扩展地理空间

mysql - 将 MySQL View 转换为 Postgres

mysql - 局部变量语法错误

sql - 添加自动增量额外列以查看 SQL Server 表中不存在的列

mysql - 如果不返回最低值

postgresql - 了解 postgresql 中子字符串的行为

stored-procedures - 如何将存储过程部署到 SQL Azure 中的联合数据库

SVN 中的 MySQL 存储过程

sql - 如何更新 T-SQL 中的日期时间字段?