powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / начала изучать Postgresql и plpgSQL, проблема с созданием функции
13 сообщений из 13, страница 1 из 1
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831280
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
итак я создаю функцию

CREATE OR REPLACE FUNCTION public."go-a"(
arg integer)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
BEGIN
UPDATE tablename SET a='0' WHERE "NUM"=arg;
END;
$BODY$;

и все работает, когда я делаю DO $$ BEGIN PERFORM go(3); END $$;
т.е значение записывается в нужную строку нужного столбца и все счастливы.

и теперь я делаю абсолютли такую же функцию, которая отличается от первой только названием и количеством аргументов, т.е добавляется 2й аргумент, который даже не используется в теле функции


CREATE OR REPLACE FUNCTION public.go(
arg integer, td "char")
RETURNS void
LANGUAGE 'plpgsql'

COST 100
VOLATILE
AS $BODY$BEGIN
UPDATE tablename SET a='0' WHERE "NUM"=arg;
tr := td;
END;$BODY$;

делаю DO $$ BEGIN PERFORM go(3, a); END $$;
и появляется ошибка: столбец 'a' не существует
СТРОКА: go(3, a)
ЗАПРОС: SELECT go(3, a)
КОНТЕКСТ: функция PL/pgSQL inline_code_block, строка 1, оператор PERFORM

ПОЧЕМУ ТАК ПРОИСХОДИТ?
мне нужен второй аргумент, чтобы добавить условия сравнения с ним
т.е вот так:
CREATE OR REPLACE FUNCTION public.go(
arg integer, td "char")
RETURNS void
LANGUAGE 'plpgsql'

COST 100
VOLATILE
AS $$
BEGIN
IF td=a THEN
UPDATE tablename SET a='0' WHERE "NUM"=arg;
ELSEIF td=b THEN
UPDATE tablename SET b='0' WHERE "NUM"=arg;
ELSEIF td=c THEN
UPDATE tablename SET c='0' WHERE "NUM"=arg;
ELSE RAISE EXCEPTION 'no such td name. Use a, b or c';
END IF;
END;
$$;
сначала я думала что условия не правильно пишу или сравниваю не так, но удалила все лишнее и все равно такое происходит
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831282
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tr := td; на эту строку не обращайте внимание, ее там не должно быть, т.е функция такая как написано, только без этой строки
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831293
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heipit,

так если хотите передать строковой литерал - как строковой литерал его и оформите.

select func(fieldname) from tablename - это корректный запрос, вызывающий func и передающий fieldname.
Именно поэтому запрос select func(fieldname); не может быть выполнен. Что такое fieldname и откуда берётся парсер не знает. Втихую считать его строкой - мысль ужасная.
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831299
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не поняла, если вы имеете в виду что нужно делать так:
select go(3, "a") from tavlename;
то это тоже не работает, та же самая ошибка появляется
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831323
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У Вас второй аргумент это некое значение или наименование столбца?
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831325
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heipit,
вместо
Код: sql
1.
 DO $$ BEGIN PERFORM go(3, a); END $$;


выполните
Код: sql
1.
select  go(3, 'a');


or, na hudoi konets

Код: sql
1.
 DO $$ BEGIN PERFORM go(3,'a'); END $$;
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831327
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya,

это наименование столбца, в виде символа
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831329
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
потому что как я поняла нельзя выбрать столбец по переданному параметру в функцию
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831330
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heipitGuzya,

это наименование столбца, в виде символа
ооо , тады втыкать в
Код: sql
1.
2.
3.
4.
5.
6.
 DO $$ BEGIN
...
a := ...;
execute 'select go(3,'||quote_ident( a)||' )'; --dynamo
....
END $$;
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831332
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

спасибо огромнейшее, помогло!
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831334
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам только изучаю postgres, есть подозрение, что тип у второй переменной должен быть соответствующим (не просто char).
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831337
heipit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

авторооо , тады втыкать в
DO $$ BEGIN
...
a := ...;
execute 'select go(3,'||quote_ident( a)||' )'; --dynamo
....
END $$;

вот это не поняла что такое, может я не правильно описала, я имела в виду, что нужно второй аргумент влияет на то, в какой столбец будет вставляться значение, т.е так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
	
CREATE OR REPLACE FUNCTION public.go(
	tr integer,
	td character)
    RETURNS character
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$

BEGIN
	 IF td='a' THEN
	 	UPDATE public."TicTacToe" SET a='3' WHERE "NUM"=tr;
	 ELSEIF td='b' THEN
	 	UPDATE public."TicTacToe" SET b='3' WHERE "NUM"=tr;
	 ELSEIF td='c' THEN
	    UPDATE public."TicTacToe" SET c='3' WHERE "NUM"=tr;
	 ELSE RAISE EXCEPTION 'no such td name. Use a, b or c';
	 END IF;
	 	RETURN td;
END;
$BODY$;
...
Рейтинг: 0 / 0
начала изучать Postgresql и plpgSQL, проблема с созданием функции
    #39831495
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heipitитак я создаю функцию

CREATE OR REPLACE FUNCTION public."go-a"(
arg integer)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
BEGIN
UPDATE tablename SET a='0' WHERE "NUM"=arg;
END;
$BODY$;

и все работает, когда я делаю DO $$ BEGIN PERFORM go(3); END $$;
т.е значение записывается в нужную строку нужного столбца и все счастливы.



Итак:
1. создается функция public."go-a"
2. PERFORM go(3)
3. что такое счастье?(ц)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / начала изучать Postgresql и plpgSQL, проблема с созданием функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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