PostgreSQL存储过程(函数)的正确语法是什么?

5
我正在尝试编写两种类型的PostgreSQL存储过程。据我所知,PostgreSQL只有函数。我想知道是否有人可以查看我的代码并提供指导。此外,我不确定命令的间距/换行是否正确。
第一个函数需要从用户那里获取输入并将其添加到表中。假设我们有一个名为“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;

现在这个功能可以正常工作了!(将model和year的值插入到Car中)。


2
你的引号不一致。你以 && 开始并以 $$ 结束。我相信 && 是一个无效的引号分隔符;你应该用 $$$SOMETHING$ 来开始和结束你的函数体。 - SingleNegationElimination
1个回答

5

来自官方文档

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 FUNCTION 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; - tvguide1234
我并不一定希望它返回表格,我只是想要插入新的元组,所以我不确定是否应该使用“RETURN TABLE”还是“RETURN VOID”。 - tvguide1234
1
不要使用RETURN。如果你在理解文档方面有问题(这是可以理解的),可以看一下示例。其中一些甚至没有RETURN子句。 - Adriano Carneiro
啊,我明白了。我要制作一个新版本来展示我的代码的“正在进行中”的版本。 - tvguide1234
好的,我明白如何编写函数1。对于函数2,我可以使用“RETURNS record”吗? - tvguide1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接