postgresql函数的mysql过程

6qqygrtg  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(686)

从mysql迁移到postgresql。

DROP PROCEDURE IF EXISTS prepend;
DELIMITER $$
CREATE PROCEDURE prepend
(
 IN inParam VARCHAR(255), 
 INOUT inOutParam INT
)
BEGIN
 DECLARE z INT;
 SET z = inOutParam + 1;
 SET inOutParam = z;
 SELECT inParam;
 SELECT CONCAT('zyxw', inParam);
END;$$
DELIMITER ;

CALL prepend('abcdefg', @inOutParam);

mysql过程调用输出为:

abcdefg
zyxwabcdefg

在此处验证输出。
下面是原始的mysql代码片段。
相应的postgresql函数不工作。请帮忙。

DROP FUNCTION prepend;

CREATE OR REPLACE FUNCTION prepend
(
 inParam VARCHAR, 
 INOUT inOutParam INT
)
AS $$
DECLARE z INT;
BEGIN 
 z := inOutParam + 1;
 inOutParam := z;
 SELECT inParam;
 SELECT CONCAT('zyxw', inParam);
END; $$
LANGUAGE plpgsql;

SELECT prepend('abcdefg', 0);
oogrdqng

oogrdqng1#

postgresql没有未绑定的查询—这种技术在sybase(如sybase、mssql)和mysql(mariadb)上可用。目前,您可以编写一个函数,该函数可以返回一组值(表格结果)或返回标量、复合或数组(常用函数)。
因此,最接近您程序的设计是:

CREATE OR REPLACE FUNCTION prepend(inparam text)
RETURNS SETOF text AS $$
BEGIN
  RETURN NEXT inparam;
  RETURN NEXT 'zyxw' || inparam;
END;
$$ LANGUAGE plpgsql;

您可以使用 SELECT ```
SELECT * FROM prepend('abcdefg');

这是所有可能的。在这种情况下,不能设置其他变量。
当您将存储过程从使用这种技术的类似sybase的系统移植到任何其他数据库(postgres、oracle、db2等等)时,这是一个常见的问题。这些系统的功能不能简单地按1:1Map。
因为postgres(plpgsql)不支持无界查询,所以语法是禁止的。

BEGIN
SELECT 1;
END;

在那里没有感觉。plpgsql函数的任何结果都可以通过 `OUT` 变量或使用 `RETURN` 声明。

相关问题