Вызов хранимой процедуры

Sehensucht!
Дата: 23.10.2003 17:49:37
Всех приветствую.

Есть ХП, у нее есть один параметр типа инт.
Надо использовать эту ХП в запросе и передавать в нее же запрос:

UPDATE mytbl SET myfld=MyFunc(SELECT id FROM tbl2 WHERE id2=mytbl.id2 LIMIT 1)


Однако, так не катит :(
Как быть?
Vel
Дата: 23.10.2003 17:59:13
А не катит, потому, что запрос может возвращать больше одного значения. Для начала, попродуй написать limit 1.
Если не поможет, копай дальше
Sehensucht!
Дата: 23.10.2003 18:06:51
Внимательнее - там есть LIMIT 1
assa
Дата: 23.10.2003 18:31:14
может быть и null - нет записей. по моему делалось CASE WHEN ... null THEN и тогда пропускало (парсер матерится?)
Sehensucht!
Дата: 23.10.2003 18:35:01
Не, по ходу дела нельзя, ругается сразу на SELECT внутри ф-ии
Придется писать скрипт на пхп, который будет перебирать записи и дергать ф-ию...
Vel
Дата: 23.10.2003 18:38:53
Упс, не заметил.
А почему нельзя вызывать селект внутри ф-ции? А там уже будешь или лдно значение брать или хоть все в цикле
Sehensucht!
Дата: 24.10.2003 10:07:53
2 Vel

ХП ожидает в качестве параметра значение типа integer (в данном конкретном случае), поэтому воспринимает SELECT как переменную, а "SELECT ..." как строку :(
Vel
Дата: 24.10.2003 11:59:01
Я имею ввиду переписать ХП так, чтобы нужный селект вызывался внутри.
Или написать надстройку - функцию, которая вызывает селект, получает значение и вызывает твою ХП с нужным значением.
От второго варианта быстродействие не пострадает, зато весь вызов будет происходить на уровне сервера, а не пхп/etc
assa
Дата: 24.10.2003 20:09:18
смешно, у меня отругался аккурат на LIMIT
CREATE FUNCTION f_test (int4 )

RETURNS int4 AS '
SELECT 1;
'
LANGUAGE 'sql';

вот это есть не хочет:

Select f_test (case when (SELECT id FROM vbtest WHERE id=4 LIMIT 1) is null then 0 else (SELECT id FROM vbtest WHERE id=4 LIMIT 1) end)

parser error near limit
а вот это схавал:

Select f_test (case when (SELECT id FROM vbtest WHERE id=4 ) is null then 0 else (SELECT id FROM vbtest WHERE id=4 ) end)

__
POSGRESQL 7.0.3
assa
Дата: 27.10.2003 10:45:07
Да, а на 7.3.х отрабатывают оба приведенных выше варианта,
отрабатывает и:

UPDATE vbtest SET id=f_test(case when (SELECT id FROM vbtest WHERE id=4 ) is null then 0 else (SELECT id FROM vbtest WHERE id=4 ) end)

и это:

UPDATE vbtest SET id=1+f_test (case when (SELECT id FROM vbtest WHERE id=1 LIMIT 1) is null then 0 else (SELECT id FROM vbtest WHERE id=1 LIMIT 1) end)

и наконец вызов типа вашего:

UPDATE vbtest SET id=2+f_test (case when (SELECT id FROM first WHERE id=vbtest.id LIMIT 1) is null then 0 else (SELECT id FROM first WHERE id=vbtest.id LIMIT 1) end)

Только что проверил:
UPDATE vbtest SET id=f_test ( (SELECT id FROM first WHERE id=vbtest.id LIMIT 1))
- сработало!!!а вот это:
UPDATE vbtest SET id=f_test ( SELECT id FROM first WHERE id=vbtest.id LIMIT 1)
выдало:
ERROR: parser: parse error at or near "SELECT" at character 598.

так что, РЕЗЮМЕ, выражения вида:
UPDATE vbtest SET id=f_test (0+(SELECT id FROM first WHERE id=vbtest.id LIMIT 1)) - проходят. А для "голого" селекта парсер шибко грамошный.