json для pg pl/sql

senich

Новичок
json для pg pl/sql

ну, собственно, может быть кто-нибудь встречал или может быть кто-нибудь писал это чудо?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
чушь, могу посоветовать изучить суть понятий и принцип использования этих технологий
 

senich

Новичок
почему чушь?
как мне вернуть из хранимой процедуры подмножества данных вместе с основной выборкой? в оракле это делается вложенными курсорами. постгрес не поддерживает вложенные курсоры. как можно реализовать подобную выборку?
как вариант рассматривается XML но не всех хостеров стоят XML библиотеки для постгреса. поэтому вот и интересуюсь JSON как средством передачи параметров из хранимых процедур в php.

что? неужели чушь?
 

Develar

Новичок
Я использую JSON для передачи массивов (http://bugs.php.net/bug.php?id=41241). Вы имеете ввиду array или что - напишите по-английски термин.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: senich
ну, собственно, может быть кто-нибудь встречал или может быть кто-нибудь писал это чудо?
Вообще бы лучше получить описание задачи, причём без отсылок "а как оно на Оракле", потому как не все понимают, что такое "вложенные курсоры".

А так --- есть PL/PHP, из него можно тупо возвращать сериализованные ([m]serialize[/m]) структуры.
 

senich

Новичок
2 Develar
нет немного не то. я чуть ниже опишу задачу.

2 Sad Spirit
задача получается следующая:
в хранимой процедуре в результате какихто манипуляций мы получаем две записи (record): user_info и pictures_info.
ну и хотелось бы их вернуть одной функцией

напеример так

OPEN p_cursor FOR
SELECT
user_info AS user,
pictures_info AS pictures;
RETURN p_cursor;

и чтобы в php в результате я получил ассоциативный массив в с полями user и pictures. и в этих элементах ассоциативные массивы(результаты выборки по польователям и картинкам).
 

Develar

Новичок
>> мы получаем две записи (record)
>> ну и хотелось бы их вернуть одной функцией
Функция возвращает единственный результат. Если надо вернуть более одного, применяем паттерн TDO - пакуем их в массив. В PHP, AS, Java, plpgsql и т. п. языках иначе нельзя.

>> ассоциативный массив в с полями user и pictures. и в этих элементах ассоциативные массивы
чтобы сразу, без лишних манипуляций, получить в таком виде, - это PDO с настроенным fetch mode (там что-то типа 2-3 флагов в зависимости от потребности - http://ru2.php.net/manual/en/function.PDOStatement-fetchAll.php)
 

neko

tеam neko
Develar
> Функция возвращает единственный результат.

не обязательно.

-~{}~ 09.11.07 08:38:

senich
что-то поток слов какой-то
XML, json, Oracle, массивы какие-то
попробуй собраться с мыслями и описать что именно ты хочешь сделать.
с реальным примером.
 

senich

Новичок
Develar
спасибо буду пробовать.

neko
хех. а может стоит внимательно прочитать? или по существу, что не понятно?
 

neko

tеam neko
Develar
> а можно подробнее? Вы имеете ввиду RETURN NEXT/RETURN QUERY?

ну не обязательно, еще есть OUT/INOUT, но в целом да.

senich
> или по существу, что не понятно?

вообще ничего непонятно.
что за проблема две записи вернуть?
 

senich

Новичок
Автор оригинала: neko
вообще ничего непонятно.
что за проблема две записи вернуть?
:D ну вот а говоришь не понятно :D

да из хранимой процедуры хочу в php вернуть две записи. я не нашёл корректного пути это сделать. если обладаешь таким умением поделись плиз а?
 

Develar

Новичок
neko
о, точно, OUT/INOUT, был неправ. тут я пас - шут его знает как оно работает с PDO.

>> я не нашёл корректного пути это сделать. если обладаешь таким умением поделись плиз а?
neko сказал - это OUT/INOUT - экспериментируй.
 

senich

Новичок
что-то я себе это плохо представляю...
передачу IN/OUT параметров из postgres в php
 

Maxim Ky

Новичок
Недавно понадобилась точно такая вещь, то бишь приблуда для сериализации pl/pgsql'ых record'ов в формат json, с сохранением имен полей, вложенных полей, массивов и всего остального. Не найдя ничего на просторах гугла засел писать сам. Очень низкая скорость сваянной на коленке процедуры на pl/pgsql, выполняющей эту задачу, сподвигла на переписывание кода на C.

Результат здесь:
http://code.google.com/p/pg-to-json-serializer/

Вообще вся эта маята с json неслучайна: это довольно удобный способ для возвращения нетабличных данных из pl/pgsql-процедуры.
 

~WR~

Новичок
Очень нужная вещь. Кажется, на pgfoundry лежит целый datatype JSON с набором необходимых функций, но он, по-моему, немного заброшен.

Поддерживается ли hstore?

Такой запрос:
PHP:
select serialize_record( q.* )
- вернет имена колонок, или стандартные f1, f2, f3?
 

Maxim Ky

Новичок
Очень нужная вещь. Кажется, на pgfoundry лежит целый datatype JSON с набором необходимых функций, но он, по-моему, немного заброшен.

Поддерживается ли hstore?

Такой запрос:
PHP:
select serialize_record( q.* )
- вернет имена колонок, или стандартные f1, f2, f3?
Поддерживаются record'ы, одномерные массивы, простые типы и любые их сочетания.

Если в record'е присутствуют имена колонок то они будут представлены в json'е, иначе стандартные f1, f2, f3
 

iceman

говнокодер
какие еще нафиг вложенные курсоры, м.б. коллекции pl/sql?

какой еще нафиг json? не хочешь делать фетч в ПХП?

ГОВНОКОДЕРЫ?
 

~WR~

Новичок
То же самое можно сказать про встроенный тип XML :)
Тем не менее, он есть.

Wiki-страничка по json: http://wiki.postgresql.org/wiki/JSON_API_Brainstorm

Различные методы сериализации на стороне базы могут быть интересны в том случае, если для выборки дополнительных данных эффективно используются подзапросы. Подзапрос должен возвращать только одну колонку. Благодаря сериализации, в эту колонку можно запихнуть целый result set.

Postgresql очень хорошо оптимизирует выполнение подзапросов. Пример плана выполнения запроса, который выбирает 50 товаров из основной таблицы + 13 (!!) подзапросов с join'ами на таблицы с множественными признаками (например, авторов у книжки может быть несколько, и мы получаем по каждому автору его id и имя).

http://explain.depesz.com/s/0r9
Sub selects хорошо видно на закладке Text.
План анонимизирован - на названия таблиц не смотрите.

В основной таблице миллион записей. В дополнительных - от ста до пятисот тысяч. Все вместе выполняется за 5 мс. ^__^ Способ подходит для небольших выборок - до 500 товаров.
 

~WR~

Новичок
И сразу, предвидя следующий вопрос.

Стандартные композитные типы далеко не всегда подходят. И, что особенно важно, для их разбора на стороне PHP приходится писать дополнительный код или использовать чужие библиотеки. В то время, как разбор JSON можно сделать вызовом стандартной функции, написанной на C.

Собственно, к такому "извращению" пришли в ходе оптимизации интернет-магазина. Результат: все товары на странице со всеми дополнительными атрибутами из 30-40 таблиц выбираются меньше, чем за 50 мс. За один запрос. Result set'ы из подзапросов сериализуются через custom aggregate методом php serialize (на json забили тогда). В php делается unserialize для разворачивания каждого сериализованного поля - получается большой вложенный массив, который напрямую отдается в шаблон. Всё.
 
Сверху