MySQL 过程到 PostgreSQL 函数

标签 mysql postgresql plpgsql

从 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

验证输出 here .

这是原始的MySQL code snippet .

相应的 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);

最佳答案

PostgreSQL 没有未绑定(bind)的查询 - 此技术可在 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:1 映射。

因为Postgres(plpgsql)没有无限查询支持,所以该语法被禁止。

BEGIN
  SELECT 1;
END;

那里没有感觉。 plpgsql函数的任何结果都可以通过使用OUT变量或使用RETURN语句来实现。

关于MySQL 过程到 PostgreSQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52682492/

相关文章:

mysql - 如何查询这些数据?

php - 不知道如何限制 PHP 中的内部 SQL 查询

sql - 在同一个表上组合两个 SQL SELECT 语句

postgresql - 我可以创建大于 RAM 的 Postgres 索引吗?

mysql - 提取日期范围之间的点击次数

php - Apache2 在 Linux Mint 17 KDE 中失败

database - postgreSQL 选择未在聚合函数中使用的其他列

sql - PostgreSQL函数中sql语言和plpgsql语言的区别

sql - 使用 LOOP 进行插入?

postgresql - plpgsql 中的 "perform create index"没有运行