|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Всех приветствую. Есть ХП, у нее есть один параметр типа инт. Надо использовать эту ХП в запросе и передавать в нее же запрос: Код: plaintext
Однако, так не катит :( Как быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 17:49 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
А не катит, потому, что запрос может возвращать больше одного значения. Для начала, попродуй написать limit 1. Если не поможет, копай дальше ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 17:59 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Внимательнее - там есть LIMIT 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 18:06 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
может быть и null - нет записей. по моему делалось CASE WHEN ... null THEN и тогда пропускало (парсер матерится?) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 18:31 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Не, по ходу дела нельзя, ругается сразу на SELECT внутри ф-ии Придется писать скрипт на пхп, который будет перебирать записи и дергать ф-ию... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 18:35 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Упс, не заметил. А почему нельзя вызывать селект внутри ф-ции? А там уже будешь или лдно значение брать или хоть все в цикле ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2003, 18:38 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
2 Vel ХП ожидает в качестве параметра значение типа integer (в данном конкретном случае), поэтому воспринимает SELECT как переменную, а "SELECT ..." как строку :( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2003, 10:07 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Я имею ввиду переписать ХП так, чтобы нужный селект вызывался внутри. Или написать надстройку - функцию, которая вызывает селект, получает значение и вызывает твою ХП с нужным значением. От второго варианта быстродействие не пострадает, зато весь вызов будет происходить на уровне сервера, а не пхп/etc ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2003, 11:59 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#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 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2003, 20:09 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Да, а на 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) Только что проверил: Код: plaintext
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)) - проходят. А для "голого" селекта парсер шибко грамошный. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 10:45 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
2 assa: Спасибо, буду иметь ввиду. Хорошая идея. Только пхп-шный скрипт уже все отработал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 11:02 |
|
Вызов хранимой процедуры
|
|||
---|---|---|---|
#18+
Да, на всяк случай я б поставил таки кейс - хотя и отсутствие данных в селект ошибки у меня не вызвало, но может зависеть от функции. - у меня, как нетрудно видеть, параметр не юзается, а проверяется только прохождение парсера. ...хотя и так: CREATE FUNCTION f_test (int4 ) RETURNS int4 AS ' SELECT $1 + 1; ' LANGUAGE 'sql'; и если SELECT id FROM first WHERE id=vbtest.id LIMIT 1 не возвращает записей, то Select f_test ((SELECT id FROM first WHERE id=vbtest.id LIMIT 1)) ошибки не вызывает, а возвращает единицу. успехов :0) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 11:02 |
|
|
start [/forum/topic.php?fid=53&msg=32304099&tid=2008077]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 316ms |
total: | 470ms |
0 / 0 |