postgresql 我试图创建一个SQL过程,错误:语法错误(示例位置:“SELECT”)

t1rydlwq  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(143)
CREATE PROCEDURE test()
BEGIN
    SELECT  'hello, I am a Procedure' AS hi;
END

字符串
错误:

ERROR: syntax error (example position: "SELECT")
LINE 3: SELECT 'hello, I am a Procedure' AS hi;
          ^

ERROR: syntax error (example position: "SELECT")
SQL state: 42601
Character: 32


我试图创建一个过程,但没有工作,我不知道该怎么办,我上网冲浪。我使用SQL剪贴簿(Eclipse(Java)),我试图通过pgAdmin 4运行查询,它也不工作。

dsekswqp

dsekswqp1#

对于Postgres,CREATE PROCEDURE文档说你可以使用AS $$ ... $$BEGIN ATOMIC ... END语法:

CREATE PROCEDURE test()
LANGUAGE SQL
AS $$
    SELECT  'hello, I am a Procedure' AS hi;
$$;

CREATE OR REPLACE PROCEDURE test()
LANGUAGE SQL
BEGIN ATOMIC
    SELECT  'hello, I am a Procedure' AS hi;
END;

字符串
对于SQL Server,不带参数的procedure声明时不带括号,不要忘记AS

CREATE PROCEDURE test1
AS BEGIN
    SELECT  'hello, I am a Procedure' AS hi;
END;

deikduxw

deikduxw2#

你试图返回一个字符串。PROCEDURE(从Postgres 16开始)只能通过使用INOUTOUT参数返回一行。所以你的尝试翻译为:

CREATE OR REPLACE PROCEDURE test(INOUT hi text = NULL)
  LANGUAGE sql AS
$proc$
SELECT 'hello, I am a Procedure';
$proc$;

字符串
或者Postgres 14或更高版本中的“SQL标准”变体:

CREATE OR REPLACE PROCEDURE test(INOUT hi text = NULL)
  LANGUAGE sql
BEGIN ATOMIC
   SELECT 'hello, I am a Procedure';
END;


或者这个简单例子的缩写形式:

CREATE OR REPLACE PROCEDURE test(INOUT hi text = NULL)
  LANGUAGE sql
RETURN 'hello, I am a Procedure';


你必须CALL一个过程来执行:

CALL test();


我们可以在调用中省略INOUT参数,因为我们将NULL声明为默认值(我们应该这样做)。
参见:

我怀疑你只是爱上了广泛使用的“存储过程”这个错误的名称,并且真的想要一个FUNCTION

相关问题