powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql: гдето вкралась ошибка. или очепятка
7 сообщений из 7, страница 1 из 1
plpgsql: гдето вкралась ошибка. или очепятка
    #34511153
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простейшая функция - и чёто никак не отлажу. вкралась какая-то очепятка. или я чего-то не понимаю - так вроде особо и нечего тут понимать :(.
Вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace function zak.zak_post_poz_ins(id_pr_poz bigint,id_tov int,pnumerom int) returns bigint as
$$
declare
	new_zp_poz_id bigint;
begin 
	INSERT INTO zak.zak_post_poz(ptov, pproizv, pnumerom, pnds, pcena, psrok, ptam_cena, pkod, fk_post)
	SELECT prep, proizv, case when $ 3  is null or $ 3  <= 0  then  1  else $ 3  end,	nds, cena, srok, tam_cena, kod, fk_post
	FROM zak.post_prices
	WHERE pk_ppr=$ 1 ;
	select lastval() into new_zp_poz_id;	
	INSERT INTO zak.ztochek_to_zpost(fk_ztochek_poz, fk_zpost_poz, kvo, kvo2)
		select id,new_zp_poz_id,kvo,kvo2 from zak.def_poz_sel_by_tov($ 2 );
	return new_zp_poz_id;
end;
$$ language plpgsql;

Вот чего пишет пгадмин:

ERROR: syntax error at or near "$1"
SQL state: 42601
Context: SQL statement in PL/PgSQL function "zak_post_poz_ins" near line 7


буксую второй вечер над этой фигнёй. и руками пошагово пробовал это выполнять - фунциклирует без проблем. и из кусков этого кода функции отдельные делать пробовал. со вторым инсертом проблем нет. а вот с первым странная картина получается.
Вот две тестовые функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
-- №1:
CREATE OR REPLACE FUNCTION test.test(int)
  RETURNS bigint AS
$BODY$
declare
	new_zp_poz_id bigint;
begin 
	INSERT INTO test.test(descr,name,age)	SELECT 'брудный селюк',
		'вася',
			case 
				when $ 1  is null or $ 1  <= 0  then  1  
				else $ 1 
			end
		FROM test.test 
		WHERE id=$ 1 ;
	select lastval() into new_zp_poz_id;	
	return new_zp_poz_id;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
-- ЭТОТ КОД БЕЗ ПРОБЛЕМ ВЫПОЛНЯЕТСЯ
--------------------------------------------------------------------
-- №2:
CREATE OR REPLACE FUNCTION test.test(int)
  RETURNS int AS
$$
declare
	newid bigint;
	g int;
begin
	g:= 1 ;newid:= 0 ;
	if $ 1  is null then 
		g:= 1 ; 
	else if  $ 1  <= 0  then 
		g:= 1 ; 
	else
		g:=$ 1  + 1 ;
	end if;
	INSERT INTO test.test(descr,age,name)
		SELECT 'брудный селюк',	g,'вася'
		FROM test.test 
		WHERE id=$ 1 ;
	newid:=lastval();	
	return newid;
end;
$$
  LANGUAGE 'plpgsql' VOLATILE;
-- а в этой тоже полтергейст какой-то странный - похожий чем-то на рабочий вариант.
-- или у меня уже крыша едет :(
помогите плз разобраться с фигнёй этой. совсем уже не знаю что думать. или может у меня со внимательностью тяжолые проблемы. я знаю что есть с этим проблемы у меня - но не думал что так всё серьёзно . . .
...
Рейтинг: 0 / 0
plpgsql: гдето вкралась ошибка. или очепятка
    #34511218
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
идентификатор pnumerom встречается в параметрах функции и в полях таблицы.

а теперь пара советов и замечаний.
1) зачем использовать именованные параметры функции, если их имена всё равно в коде не используются. это может привести и проводит к вышеприведенным ошибкам.
2) Если по каким-либо причинам не используются именованные параметры функции, то рекомендую использовать алиасы (ALIAS) к параметрам фукций. Это со всех сторон правильный подход. Ибо идентификаторы типа $1 неинформативны и трудочитаемы :)

Удачи!
...
Рейтинг: 0 / 0
plpgsql: гдето вкралась ошибка. или очепятка
    #34511457
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
огромное спасибо!!!
блин - скоко я парился с этой фигнёй. действительно это из-за параметра этого. его переименовал - и всё заработало.
я токо одного не понял (не сильно громко смейтесь :) - я зеленоват в этом деле)- вроде как к параметрам именованым нельзя в теле функции по имени обратиться? или я что-то пропустил . . . я думал что токо через алиазы можно - не зависимо от того, есть у них имена - или токо тип их задан.
ну а зачем я их именую - так это чтобы потом вспомнить что это и зачем.
ну а по алиазам для параметров - я тоже сначала думал мол информативно это и всё такое - но потом как-то мне удобнее показалось использовать их без алиазов. это просто нагляднее. почему? потому, что сразу видно, что это параметр. а что за параметр - смотрим имя его в заголовке функции. а если с алиазом - то там немного больше нужно времени чтобы разобраться где параметр - а где имя поля или просто переменная. есть конечно ещё комментарии - но на их чтение тоже нужно время - а так и без них всё ясно.
...
Рейтинг: 0 / 0
plpgsql: гдето вкралась ошибка. или очепятка
    #34511470
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин - сам теперь не могу понять почему я решил, что если именованые параметры у функции - то всёравно алиасы нужны - или по номеру к ним нужно обращаться. от же ш остолоп.
теперь понял - можно и нужно по имени к ним обращаться без отэтих извращений :).
большое спасибо!!!
...
Рейтинг: 0 / 0
plpgsql: гдето вкралась ошибка. или очепятка
    #34511479
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё вот заметил - подсвечивается newid почемуто. это вроде в pgsql ничего не обозначает? вроде это в m$sql или в аксесе - не помню точно где - как в pgsql lastval(). наверное просто на форуме подсветка одна для всех диалектов? или я что-то опять пропустил?
...
Рейтинг: 0 / 0
plpgsql: гдето вкралась ошибка. или очепятка
    #34511763
ездун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выучи зарезервированные слова в PG и никогда их не используй, если не хочешь опять гемор огрести.
...
Рейтинг: 0 / 0
plpgsql: гдето вкралась ошибка. или очепятка
    #34511833
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так что - newid в пгскле зарезервированое слово? вроде нет . . .
это так в мсскл новое значение гвида получается. или и в пгскле тоже . . . :). надо короче немного подчитать на досуге мануал . . .
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql: гдето вкралась ошибка. или очепятка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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