Ограничение
Кажется, именно так реализован PostgreSQL.Чтение документов :
35.4.5.Функции SQL с переменным числом аргументов
Функции SQL могут быть объявлены для приема переменных чисел аргументов, поэтому , поскольку все "необязательные" аргументы имеют один и тот же тип данных .Необязательные аргументы будут переданы функции в виде массива.Функция объявляется путем пометки последнего параметра как VARIADIC;этот параметр должен быть объявлен как тип массива.
JSON
Если вы найдете способ экспортировать ваш смешанный массив в формат JSON из Oracle, то PostgreSQL JSON типа справится с этим:
CREATE OR REPLACE FUNCTION xdecode(data json)
RETURNS TEXT AS
$BODY$
-- Your implementation here
SELECT NULL::TEXT;
$BODY$ LANGUAGE SQL;
Эта функция принимает строку JSON и может иметь вид:
SELECT xdecode('[1, 2, 3.3, "a", true, null]'::json);
Тип таблицы
Если кортеж аргументов, которые вы хотите декодировать, соответствует типу TABLE
, затем вы можете использовать его:
CREATE TABLE foo(
x INTEGER,
y FLOAT,
z TEXT
);
CREATE OR REPLACE FUNCTION xdecode2(data foo)
RETURNS TEXT AS
$BODY$
SELECT row_to_json(data)::TEXT;
$BODY$ LANGUAGE SQL;
Тогда этот вызов работает:
SELECT xdecode2((1, 2.1, 'x'))
К сожалению, мы не можем использовать общий тип RECORD
в качестве входного аргумента для функции.
CREATE OR REPLACE FUNCTION xdecode3(data RECORD)
RETURNS TEXT AS
$BODY$
SELECT row_to_json(data)::TEXT;
$BODY$ LANGUAGE SQL;
Повышает:
ERROR: SQL functions cannot have arguments of type record
SQL state: 42P13
Тип anyelement
Как указано @basin, тип RECORD
можно эмулировать с помощью anyelement
:
CREATE OR REPLACE FUNCTION xdecode4(data anyelement)
RETURNS TEXT AS
$BODY$
SELECT row_to_json(data)::TEXT;
$BODY$ LANGUAGE SQL;
SELECT xdecode4((1, 2.1, 'x'));
Возвращает:
'{"f1":1,"f2":2.1,"f3":"x"}'