powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как передать значение поля в SPI_execute_plan
7 сообщений из 7, страница 1 из 1
Как передать значение поля в SPI_execute_plan
    #33371337
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется подготовленный и сохраненный план. Имеется строка-значение, которую нужно передать в SPI_execute_plan. Как преобразовать эту строку в Datum?
...
Рейтинг: 0 / 0
Как передать значение поля в SPI_execute_plan
    #33371431
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HordiИмеется подготовленный и сохраненный план. Имеется строка-значение, которую нужно передать в SPI_execute_plan. Как преобразовать эту строку в Datum?

преобразование к датуму имеет несколько нюансов..
1) функция преобразования к датуму - должна быть соответствующая (как я понимаю, кодировка представления чтоб совпадала)...Для массива байт это
PointerGetDatum(x). Кстати можете описание найти в ашнике постгресса postgres.h
2) Время жизни выделенной памяти. Надо не забывать, так же что существует понятие контекст памяти...


вроде так...
с уважением
(круглый)
...
Рейтинг: 0 / 0
Как передать значение поля в SPI_execute_plan
    #33371583
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PointerGetDatum пробовал - вылетает база на выполнении SPI_execute_plan :(
Указатель передавал действительный 100% (специально предварительно копии строк создал). Копии строк делал через palloc,memcpy.
...
Рейтинг: 0 / 0
Как передать значение поля в SPI_execute_plan
    #33372170
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HordiPointerGetDatum пробовал - вылетает база на выполнении SPI_execute_plan ....

тогда глупые вопросы...
1) есть ли
SPI_prepare(бла-бла-бла);
не спотыкаеться ли на нём ? если есть - я так понимаю что подготовка проходит успешно...
2) что пишет сам постгресс на данной ошипке...см..
PG_TRY();
{
бла-бла-бла
}
PG_CATCH();
{
бла-бла-бла
ErrorData* pED = NULL;
pED = CopyErrorData();
см. структуру...
FlushErrorState();
бла-бла-бла
}
PG_END_TRY();

3) все ли параметры передаються ?
SPI_execute_plan(void *plan, Datum *Values, const char *Nulls, bool read_only, int tcount);
типа...
arg_types[0] = TEXTOID;
void * plan = SPI_prepare(sql, 2, arg_types);
if (nulls[0] == ' ')
args[0] = PointerGetDatum(value);
int ret = SPI_execute_plan(plan, args, nulls, false, 0);

4) есть ли инструкция типа SPI_CONNECT

5) проходит ли в данном месте вызовы просче...типа...
SPI_exec(sql, 0);


с уважением
(круглый)
...
Рейтинг: 0 / 0
Как передать значение поля в SPI_execute_plan
    #33372940
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем разобрался в чем проблема.
Передаваемые значения в Datum должны иметь стандартный в посгресе формат, такой как у получаемых параметрах функций и в значениях, которые эти функции возвращают. Т.е. строка (или иной параметр) должна формироваться по такому (или подобному) правилу:

const int SZ = sizeof("txt")-1;
text *p = (text*)palloc(SZ+VARHDRSZ);
VARATT_SIZEP(p) = SZ+VARHDRSZ;
memcpy(VARDATA(p),"txt",SZ);

Datum dt[1];
dt[0] = CStringGetDatum(p);

ret = SPI_execute_plan(plan,dt,...

pfree(p);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как передать значение поля в SPI_execute_plan
    #34565849
Ilya Storozhilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проебразование (char *) в Datum:
Код: plaintext
Datum datumValue = DirectFunctionCall1(textin, CStringGetDatum(cStringValue));
Проебразование Datum в (char *)
Код: plaintext
char *cStringValue = DatumGetCString(DirectFunctionCall1(textout, datumValue));
Почему для этого недостаточно макросов
Код: plaintext
CStringGetDatum()
и
Код: plaintext
DatumGetCString()
, что по логике вещей следует из их названия я так и не понял. Может кто-нибудь объяснит, тогда, зачем они нужны и какой был смысл их вводить, если они не делают то, что от них ожидаешь?
Спасибо!
...
Рейтинг: 0 / 0
Как передать значение поля в SPI_execute_plan
    #34566027
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HordiВ общем разобрался в чем проблема.
Передаваемые значения в Datum должны иметь стандартный в посгресе формат, такой как у получаемых параметрах функций и в значениях, которые эти функции возвращают. Т.е. строка (или иной параметр) должна формироваться по такому (или подобному) правилу:

const int SZ = sizeof("txt")-1;
text *p = (text*)palloc(SZ+VARHDRSZ);
VARATT_SIZEP(p) = SZ+VARHDRSZ;
memcpy(VARDATA(p),"txt",SZ);

Datum dt[1];
dt[0] = CStringGetDatum(p);

ret = SPI_execute_plan(plan,dt,...

pfree(p);
CStringGetDatum uje tut ne nujno. Mojno srazu vmesto dt podstavit' (Datum *)p.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как передать значение поля в SPI_execute_plan
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]