powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры
12 сообщений из 12, страница 1 из 1
Вызов хранимой процедуры
    #32303526
Sehensucht!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех приветствую.

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

Код: plaintext
UPDATE mytbl SET myfld=MyFunc(SELECT id FROM tbl2 WHERE id2=mytbl.id2 LIMIT  1 )


Однако, так не катит :(
Как быть?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32303547
Vel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не катит, потому, что запрос может возвращать больше одного значения. Для начала, попродуй написать limit 1.
Если не поможет, копай дальше
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32303560
Sehensucht!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внимательнее - там есть LIMIT 1
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32303585
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть и null - нет записей. по моему делалось CASE WHEN ... null THEN и тогда пропускало (парсер матерится?)
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32303592
Sehensucht!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, по ходу дела нельзя, ругается сразу на SELECT внутри ф-ии
Придется писать скрипт на пхп, который будет перебирать записи и дергать ф-ию...
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32303597
Vel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, не заметил.
А почему нельзя вызывать селект внутри ф-ции? А там уже будешь или лдно значение брать или хоть все в цикле
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32303919
Sehensucht!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Vel

ХП ожидает в качестве параметра значение типа integer (в данном конкретном случае), поэтому воспринимает SELECT как переменную, а "SELECT ..." как строку :(
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32304099
Vel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду переписать ХП так, чтобы нужный селект вызывался внутри.
Или написать надстройку - функцию, которая вызывает селект, получает значение и вызывает твою ХП с нужным значением.
От второго варианта быстродействие не пострадает, зато весь вызов будет происходить на уровне сервера, а не пхп/etc
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32304876
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смешно, у меня отругался аккурат на 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
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32305736
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, а на 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 ))
- сработало!!! а вот это:
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)) - проходят. А для "голого" селекта парсер шибко грамошный.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32305769
Sehensucht!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 assa:

Спасибо, буду иметь ввиду. Хорошая идея.
Только пхп-шный скрипт уже все отработал :)
...
Рейтинг: 0 / 0
Вызов хранимой процедуры
    #32305770
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, на всяк случай я б поставил таки кейс - хотя и отсутствие данных в селект ошибки у меня не вызвало, но может зависеть от функции. - у меня, как нетрудно видеть, параметр не юзается, а проверяется только прохождение парсера.

...хотя и так:

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)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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