PostgreSQL: рефкурсор и имя портала - PullRequest
0 голосов
/ 24 сентября 2018

Как мы знаем, PostgreSQL имеет refcursors.Я понимаю их как ссылку на курсор, т. Е. Если

DECLARE
  _var refcursor;

, чем он может хранить имя для портала:

_var = 'cursor_name_1';

Мы можем использовать его и изменить имя позже:

_var = 'cursor_name_2'; --now same variable will reference to another portal

Мы можем извлечь из переменной refcursor:

FETCH ALL FROM _var;

или использовать имя портала:

FETCH ALL FROM "cursor_name_1"; --double-quoted

Вопросы:

Q1. Почему я не могу написать

FETCH ALL FROM 'cursor_name_1'; --string literal (single-quoted)

, но я могу использовать:

_var = 'cursor_name_1'

Q2. Какой тип предложения PostgreSQL ожидает в FETCH FROM?

Q3. Что означает имя портала в двойных кавычках "cursor_name_1", если оно может использоваться в FETCH FROM, но не может использоваться в назначении?

1 Ответ

0 голосов
/ 24 сентября 2018

В SQL строки в одинарных кавычках представляют собой строковые константы (также известные как строковые литералы ), в то время как строки в двойных кавычках представляют собой заключенные в кавычки идентификаторы , то естьимена для таких объектов, как таблицы, столбцы ... или курсоры.

Не путайте эти две вещи.

У каждого курсора есть имя, по которому вы должны ссылаться на него в SQL.Вот почему вам нужно использовать двойные кавычки в операторе SQL FETCH.

В PL / pgSQL вы можете иметь переменную типа refcursor.Теперь, если вы назначаете строковый литерал переменной, вы устанавливаете имя курсора.Это источник вашей путаницы, и я утверждаю, что это сбивает с толку.

...