Мы мигрировали с SQL Сервера на Postgres, и я пытаюсь переписать хранимую процедуру. Процедура создана правильно, но я не могу ее вызвать.
Это моя процедура:
CREATE OR REPLACE PROCEDURE spr_getItems (
p_kind int = NULL,
p_customerId varchar(256) = NULL,
p_resourceIds varchar(2048) = NULL,
p_referenceIds varchar(2048) = NULL
)
AS $$
BEGIN
SELECT
c.kind,
c.name AS customerName,
c.oid AS customerId,
r.name AS resourceName,
r.oid AS resourceId
o.fullObject AS fullObjectString
FROM m_customer c
JOIN m_resource r
ON r.oid = c.resourceOid
LEFT JOIN m_object o
ON o.customerOid = c.oid
AND o.customerOid = p_customerId
WHERE (c.kind = p_kind OR p_kind is NULL)
AND (c.referenceOid IN (SELECT refTemp.oid FROM tvf_commaSeperatedStringToTable(p_referenceIds) refTemp) OR p_referenceIds is NULL)
AND (r.oid IN (SELECT resTemp.oid FROM tvf_commaSeperatedStringToTable(p_resourceIds) resTemp) OR p_resourceIds is NULL);
END;
$$
LANGUAGE 'plpgsql';
табличная функция tvf_commaSeperatedStringToTable
просто берет строку, разбивает ее и возвращает таблицу со всеми различными идентификаторами и номером. Он работает просто отлично и протестирован, здесь нет ошибок.
Теперь, когда я пытаюсь выполнить его следующим образом
CALL public.spr_getItems (0, null, null, null)
, я получаю следующий вывод:
ОШИБКА: у запроса нет места назначения для данных результата
СОВЕТ: Если вы хотите отменить результаты SELECT, используйте вместо этого PERFORM.
КОНТЕКСТ: PL / pg SQL функция spr_getItems (целое число, символ изменяющийся, изменяющийся символ, изменяющийся символ) строка 3 в SQL оператор
SQL состояние: 42601
Но я НЕ хочу отменить результат, я хочу их увидеть.
Итак, я попытался вызвать его с помощью select
SELECT *
FROM CALL spr_getItems (0, null, null, null)
, и затем я получил эту синтаксическую ошибку:
ERROR: синтаксическая ошибка в или около "0"
LINE 2: 0,
^
SQL состояние: 42601
Символ: 40
Я также попытался выполнить его несколькими другими способами, например, добавив «publi *» 1055 * «. перед именем процедуры, но затем произошла синтаксическая ошибка в «.». Или просто с помощью select spr_getItems(0, null, null, null)
или select spr_getItems(0)
, select * from call spr_getItems (0)
и т. Д. И т. П.
Я делаю что-то совершенно неправильно и что-то упустил из виду в документации?
Спасибо за любые help!
Edit: уточнение, что я хочу увидеть результаты
Edit2: случайно скопировал неправильное имя функции
Edit3: добавлено полное тело в соответствии с предложением