Процедура MySQL для функции PostgreSQL - PullRequest
0 голосов
/ 06 октября 2018

Миграция с 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);

1 Ответ

0 голосов
/ 07 октября 2018

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;

Не имеет смысла там.Любой результат функций plpgsql может быть реализован с помощью переменных OUT или оператора RETURN.

...