PHP передача и возврат данных из функции PgSQL?

intDex

Новичок
PHP передача и возврат данных из функции PgSQL?

PHP 5 интересует пример:
1) Скажем в функцию передаться параметры -> Иван; Иванов; Иванович;
2) Сама функция не интересно что будет делать;
3) Забираем значение из функции;
 

nirex

Новичок
select сName1, сName2 ... сNameN from someFunction('Иван', 'Иванов', 'Иванович') etc;
 

nirex

Новичок
function someFunc($name, $middle, $surname)
{
...................
return $out
}

$anyVar = someFunc('Gadya', 'Petrovisch', 'Hrenova');

Вообще вопрос не совсем ясен.
Читай книжки.
 

intDex

Новичок
nirex
Ты знаеш такое, хранимые функции, процедуры(так называемые курсоры), триггеры?
так вот с ними надо/можно как-то работать из PHP ты представляешь?;) Ну не считая триггеров, они сами срабатывают на произведение каких либо действий.
А вопрос то и был как с этим добром работать на PHP.

Апокалипсис спасибо в самих мануалах копался(офлайн версия), примера не нашел, а вот в вопросах под ним это было.

PHP:
<?php
$response = pg_query( $connection, "BEGIN; DECLARE s CURSOR FOR SELECT get_consumer('harry');
 FETCH ALL IN s; END;" );
?>
CREATE OR REPLACE FUNCTION get_consumer( varchar )
RETURNS refcursor
AS '
DECLARE
_name ALIAS FOR $1;
r refcursor;
BEGIN
OPEN r FOR SELECT name FROM consumer
WHERE
consumer.name = _name
;
RETURN r;
END
' LANGUAGE 'plpgsql';
 

nirex

Новичок
intDex читай мануал который тебе дал Апокалипсис там все есть.
но на миг могу побыть телепатом и предположить что тебе нужна инфа по структуре этих самых функции, триггеров и т.п.
чтоб сильно не расслаблялся читай исходники phpPgAdmin :))))))
 

intDex

Новичок
nirex нет по ним как раз таки не нужна, телепатия не удалась. Читать учись, я думаю сам. Или если не вникаешь то не писать не грамотные ответы.
 

Mols

Новичок
В продолжение темы.
Как я понял получение множества строк из процедуры принято в ПГ реализовывать через конструкции вида
Код:
    FOR r IN SELECT * FROM table
    LOOP
        RETURN NEXT r; 
    END LOOP;
И это вроде как нормально.
Вопрос у меня такой. Если мне нужно возвращать не строку из таблицы, а часть строки. Например 2 поля (или наоборот результат джойна). При этом вернуть нужно множество строк. Как объявлять функцию (возвращаемый тип)? Представления делать ? или в ПГ принято гонять селекты между СУБД и ПХП ?
З.Ы.
Пытался вкурить объявление новых типов данных... мне показалось, что это сложноватое решение такой простой задачи.
 

Develar

Новичок
(_parent int, out type_id int, out type_name text) returns record as $$

declare

current_parent int default _parent;

begin

while current_parent is not null loop
select id, name into type_id, type_name from types.types where id = (select type from contents.tree where parent = current_parent and (type > 99 or type = 11) and not deleted limit 1);
if type_name is null then
select id from contents.tree into current_parent where parent = current_parent and type = 12 and not deleted limit 1;
else
return;
end if;
end loop;

end;
$$ language plpgsql;

PHP:
$pdo = Db::instance()->prepare('select * from types.catalog_children_type(:id)');
		$pdo->bindValue(':id', Request::instance()->getId(), PDO::PARAM_INT);
		$pdo->execute();		
		$pdo->bindColumn(1, $this->_typeId, PDO::PARAM_INT);
		$pdo->bindColumn(2, $this->_typeName, PDO::PARAM_STR);
кури http://www.postgresql.org/docs/8.3/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
если language sql, то там проще.
 

MiksIr

miksir@home:~$
Mols
Код:
    FOR r IN SELECT f1,f2,f3 FROM table
    LOOP
        RETURN NEXT r; 
    END LOOP;
и далее или объявляешь тип возврата record и пишешь
funcname(params) as (f1 integer, f2 integer)
или определяешь свой составной тип данных (int,int) и его назначешь на r ну и на возврат функции.

-~{}~ 22.02.08 16:14:

CREATE TYPE mytype AS (f1 integer, f2 integer);
CREATE OR REPLACE FUNCTION myfunc(params) RETURNS SETOF mytype AS...
Чего сложного то ;)
 

Develar

Новичок
>> Чего сложного то
самое сложное — придумать имя типа. к тому же если он используется только для этой функции.
 

Mols

Новичок
MiksIr
наверное я чего-то не понял. Я когда читал понял так, что необходимо ещё описывать для каждого типа функции которые будут уметь переделывать его в строку... как-то так.
 

Develar

Новичок
Mols
Есть большое количество способов. Их разнообразие обусловлено не тем, что они делают одно и то же, но синтаксис отличен, а конкретной применимостью в том или ином случае. Поставь себе задачу и разберись — это не MySQL, здесь ты наверняка найдешь прямой способ.

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

Mols

Новичок
м да. Спасибо за помощь. Не разобрался я в создании типов. Действительно в моём случае ничего сложного не нужно.
 
Сверху