GET DESCRIPTOR
GET DESCRIPTOR — получить информацию из области дескриптора SQL
Синтаксис
GET DESCRIPTORимя_дескриптора
:cvariable
=элемент_заголовка_дескриптора
[, ... ] GET DESCRIPTORимя_дескриптора
VALUEномер_столбца
:cvariable
=элемент_дескриптора
[, ... ]
Описание
GET DESCRIPTOR
получает информацию о наборе результатов запроса из области дескриптора SQL и сохраняет её в переменные среды. Область дескриптора обычно предварительно заполняется командами FETCH
или SELECT
, чтобы из неё можно было перенести сопутствующую информацию в переменные среды.
Эта команда имеет две формы: первая форма выдаёт элементы из «заголовка» дескриптора, который относится ко всему набору результатов в целом. Например, это число строк. Другая форма, требующая указания в дополнительном параметре номера столбца, выдаёт информацию о конкретном столбце строки. В качестве примеров можно привести имя столбца и фактическое значение в этом столбце.
Параметры
имя_дескриптора
Имя дескриптора.
элемент_заголовка_дескриптора
Идентификатор, определяющий, какой элемент заголовка нужно получить. В настоящее время поддерживается только
COUNT
, позволяющий получить число столбцов в наборе результатов.номер_столбца
Номер столбца, информацию о котором нужно получить. Нумерация начинается с 1.
элемент_дескриптора
Идентификатор, определяющий, какой элемент информации о столбце нужно получить. Список поддерживаемых элементов приведён в Подразделе 36.7.1.
cvariable
Переменная среды C, в которую будут сохранены данные, полученные из области дескриптора.
Примеры
Пример получения числа столбцов в наборе результатов:
EXEC SQL GET DESCRIPTOR d :d_count = COUNT;
Пример получения размера данных в первом столбце:
EXEC SQL GET DESCRIPTOR d VALUE 1 :d_returned_octet_length = RETURNED_OCTET_LENGTH;
Пример получения содержимого данных второго столбца в виде строки:
EXEC SQL GET DESCRIPTOR d VALUE 2 :d_data = DATA;
Следующий пример демонстрирует всю процедуру выполнения SELECT current_database();
и вывода числа столбцов, длины данных в столбце и содержимого столбца:
int main(void) { EXEC SQL BEGIN DECLARE SECTION; int d_count; char d_data[1024]; int d_returned_octet_length; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO testdb AS con1 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL ALLOCATE DESCRIPTOR d; /* Объявить, открыть курсор и присвоить ему дескриптор */ EXEC SQL DECLARE cur CURSOR FOR SELECT current_database(); EXEC SQL OPEN cur; EXEC SQL FETCH NEXT FROM cur INTO SQL DESCRIPTOR d; /* Получить общее число столбцов */ EXEC SQL GET DESCRIPTOR d :d_count = COUNT; printf("d_count = %d\n", d_count); /* Получить размер возвращённого столбца */ EXEC SQL GET DESCRIPTOR d VALUE 1 :d_returned_octet_length = RETURNED_OCTET_LENGTH; printf("d_returned_octet_length = %d\n", d_returned_octet_length); /* Выбрать возвращённый столбец в виде текстовой строки */ EXEC SQL GET DESCRIPTOR d VALUE 1 :d_data = DATA; printf("d_data = %s\n", d_data); /* Закрытие */ EXEC SQL CLOSE cur; EXEC SQL COMMIT; EXEC SQL DEALLOCATE DESCRIPTOR d; EXEC SQL DISCONNECT ALL; return 0; }
При выполнении этого примера будет получен такой результат:
d_count = 1 d_returned_octet_length = 6 d_data = testdb
Совместимость
Команда GET DESCRIPTOR
описана в стандарте SQL.
См. также
ALLOCATE DESCRIPTOR, SET DESCRIPTOR43.10. Transaction Management
In a procedure called from the top level or an anonymous code block (DO
command) called from the top level it is possible to control transactions. To commit the current transaction, call the commit
command. To roll back the current transaction, call the rollback
command. (Note that it is not possible to run the SQL commands COMMIT
or ROLLBACK
via spi_exec
or similar. It has to be done using these functions.) After a transaction is ended, a new transaction is automatically started, so there is no separate command for that.
Here is an example:
CREATE PROCEDURE transaction_test1() LANGUAGE pltcl AS $$ for {set i 0} {$i < 10} {incr i} { spi_exec "INSERT INTO test1 (a) VALUES ($i)" if {$i % 2 == 0} { commit } else { rollback } } $$; CALL transaction_test1();
Transactions cannot be ended when an explicit subtransaction is active.