Я написал функцию БД для plpgsql (postgre) в супабазе.
При объявлении курсора я всегда получаю ERROR: 42P01: relation "cursor1" does not exist
.
Вот как я это заявляю:
DECLARE
cursor1 CURSOR FOR
SELECT public.spending_cap.cap, public.spending_cap.spent, public.spending_cap.image_cap, public.spending_cap.image_spent, public.spending_cap.id, public.spending_cap.created_by FROM public.spending_cap, public.user_profile WHERE is_parent = true AND public.user_profile.id = public.spending_cap.created_by AND organisation is NULL;
entry cursor1%rowtype;
Я просто заявляю cursor1
как можно говорить, что отношения не существует? Если я просто выполню оператор SELECT
, я получу результат. Я использую этот объявленный курсор для перебора одного и того же оператора SELECT
.
Любые намеки на то, что я делаю неправильно?
@LaurenzAlbe Хм вот они этим пользуются.
«Здесь» — это pl/sql в Oracle, а не pl/pgsql в Postgres. См. тип строки для Postgres.
Немного оффтоп: Зачем вам курсор? В PL/pgSQL это вряд ли необходимо, курсор уже используется внутри. Какую проблему, с которой вы столкнулись, она должна решить?
Взгляните на 43.6.6. Перебор результатов запроса и 43.7. Курсоры . Вы можете объявить переменную записи, а затем указать ее в качестве итератора в цикле for
непосредственно по запросу, чтобы получить неявный курсор. %rowtype предназначен для таблиц, составных типов и представлений.
PL/pgSQL не допускает %ROWTYPE
для курсорных переменных. Движок PL/pgSQL сильно отличается от Oracle и просто выходит за рамки концепции PL/pgSQL. Вероятно, реализовать эту функцию не составит труда, но она выходит за рамки концепции. Вместо этого вам следует использовать тип RECORD
:
DECLARE
cursor1 CURSOR FOR
SELECT public.spending_cap.cap, public.spending_cap.spent, public.spending_cap.image_cap, public.spending_cap.image_spent, public.spending_cap.id, public.spending_cap.created_by FROM public.spending_cap, public.user_profile WHERE is_parent = true AND public.user_profile.id = public.spending_cap.created_by AND organisation is NULL;
entry record;
Попробуйте прочитать соответствующую документацию. Хотя синтаксис иногда похож, в деталях между курсорами PL/pgSQL и курсорами PL/SQL существует множество различий.
Я думаю, вы не можете использовать
%rowtype
с курсором.