MySQL程序到PostgreSQL功能

时间:2018-10-06 19:11:02

标签: 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);

1 个答案:

答案 0 :(得分:1)

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:1映射。

由于Postgres(plpgsql)没有不受限制的查询支持,因此语法被禁止。

BEGIN
  SELECT 1;
END;

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