Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / начала изучать Postgresql и plpgSQL, проблема с созданием функции / 13 сообщений из 13, страница 1 из 1
27.06.2019, 16:42
    #39831280
heipit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
итак я создаю функцию

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
27.06.2019, 16:47
    #39831282
heipit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
tr := td; на эту строку не обращайте внимание, ее там не должно быть, т.е функция такая как написано, только без этой строки
...
Рейтинг: 0 / 0
27.06.2019, 17:04
    #39831293
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
heipit,

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

select func(fieldname) from tablename - это корректный запрос, вызывающий func и передающий fieldname.
Именно поэтому запрос select func(fieldname); не может быть выполнен. Что такое fieldname и откуда берётся парсер не знает. Втихую считать его строкой - мысль ужасная.
...
Рейтинг: 0 / 0
27.06.2019, 17:18
    #39831299
heipit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
не поняла, если вы имеете в виду что нужно делать так:
select go(3, "a") from tavlename;
то это тоже не работает, та же самая ошибка появляется
...
Рейтинг: 0 / 0
27.06.2019, 18:02
    #39831323
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
У Вас второй аргумент это некое значение или наименование столбца?
...
Рейтинг: 0 / 0
27.06.2019, 18:04
    #39831325
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
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
27.06.2019, 18:04
    #39831327
heipit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
Guzya,

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

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

спасибо огромнейшее, помогло!
...
Рейтинг: 0 / 0
27.06.2019, 18:14
    #39831334
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
Сам только изучаю postgres, есть подозрение, что тип у второй переменной должен быть соответствующим (не просто char).
...
Рейтинг: 0 / 0
27.06.2019, 18:20
    #39831337
heipit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
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
28.06.2019, 10:25
    #39831495
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
начала изучать Postgresql и plpgSQL, проблема с созданием функции
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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / начала изучать Postgresql и plpgSQL, проблема с созданием функции / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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