【问题标题】:What is the proper syntax for PostgreSQL stored procedures (functions)?PostgreSQL 存储过程(函数)的正确语法是什么?
【发布时间】:2011-10-24 05:40:44
【问题描述】:

我正在尝试在 PostgreSQL 中编写两种类型的存储过程。据我了解,Postgre 只有功能。我想知道是否有人可以查看我的代码并提供指针。另外,我不熟悉命令的间距/新行。

第一个函数需要从用户那里获取输入并将其添加到表格中。 假设我们有一个表名“Car”,属性为“model”和“year”。 这将是一个正确的存储函数来将一辆新车添加到表中吗?

CREATE OR REPLACE FUNCTION
    addto_car(model IN Car.model%type, year IN Car.year%type)
RETURNS
    void
AS $$
BEGIN
    INSERT INTO Car VALUES(model, year);
END;
$$ LANGUAGE plpgsql; (#Is this correct? I'm using postgresql 9)

--------- 正在进行的代码 功能 1

CREATE OR REPLACE FUNCTION
    addto_car(In model Car.model%type, IN year Car.year%type)
AS $$
BEGIN
    INSERT INTO Car VALUES(model, year);
END;
$$ LANGUAGE plpgsql;

现在可以了! (将值模型和年份插入 Car)。

【问题讨论】:

  • 您的报价不一致。您以&& 开头并以$$ 结尾。我很确定&& 是一个无效的引号分隔符;你应该以$$$SOMETHING$ 开始和结束你的函数体。

标签: sql postgresql stored-procedures plpgsql


【解决方案1】:

来自Official Documentation

CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE lang_name
    | WINDOW
    | IMMUTABLE | STABLE | VOLATILE
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | COST execution_cost
    | ROWS result_rows
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...
    [ WITH ( attribute [, ...] ) ]

你会在那里找到你的答案,也许你会在这个过程中学到两三件有用的东西。

您可能对RETURNS TABLE 结构特别感兴趣。

【讨论】:

  • 嗯,我很难理解所有的命令。看看我的第一个函数,对于“argtype”,我应该输入“IN”,因为我想将用户输入的值输入数据库? CREATE OR REPLACE FUCTION addto_car(IN model Car.model%type, IN year Car.year%type) RETURNS void AS $$ BEGIN INSERT INTO Car VALUES(model, year); END; $$ LANGUAGE plpgsql;
  • 我不一定希望它返回表,我只是希望它插入新的元组,所以我不确定我应该使用“返回表”还是“返回无效”跨度>
  • 那么不要使用RETURN。如果您在弄清楚文档时遇到问题(这是可以理解的),请查看示例。其中一些甚至没有RETURN 子句。
  • 啊,我明白了。我将制作一个新版本,以显示我的代码的“正在进行中”版本。
  • 好的,我了解如何执行功能1。对于功能2,我可以使用RETURNS record吗?
猜你喜欢
  • 2011-12-03
  • 2019-10-19
  • 2013-08-06
  • 2015-10-22
  • 2019-05-29
  • 2013-02-09
  • 2011-06-12
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多