powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / использование функций
20 сообщений из 20, страница 1 из 1
использование функций
    #32103584
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго здоровья всем!!!

Такая проблема

Создаю функцию CREATE FUNCTION myfunc (smallint, name, text) ...

при попытке ее выполнить

SELECT myfunc(1,'some','some')

выдается ошибка, что функция типа myfunc(integer, "unknown", "unknown")
не найдена - переопределите typecast

перегрузка функции исключена

в чем может быть проблема

ПС Postgresql 7.3.2
...
Рейтинг: 0 / 0
использование функций
    #32103756
SSY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запости определение функции, а то не понятно даже на каком она языке.
...
Рейтинг: 0 / 0
использование функций
    #32104105
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE FUNCTION myfunc (smallint, name, text) returns integer
as '
declare
in_p1 alias for $1;
in_p2 alias for $2;
in_p3 alias for $3;
out_p integer;
begin
insert into mytable(p1,p2,p3) values (in_p1, in_p2, in_p3);
if found
out_p = currval(mytable_id_seq);
return out_p;
else
return 0;
end if;
end;'
language 'plpgsql';

ПС: PSPGSQL подрублен

ругань как я понял именно на объявление идет
...
Рейтинг: 0 / 0
использование функций
    #32104169
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.commandprompt.com/ppbook/index.lxp?lxpwrap=c19610%2ehtm
вот здесь приведены примеры, как добавить PL/pgsql надеюсь понятно


Example 11-1. Creating the PL/pgSQL call handler

booktown=# CREATE FUNCTION plpgsql_call_handler ()
booktown-# RETURNS OPAQUE
booktown-# AS '/usr/local/pgsql/lib/plpgsql.so'
booktown-# LANGUAGE 'C';
CREATE

Example 11-2. Adding PL/pgSQL with CREATE LANGUAGE

booktown=# CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler
booktown-# LANCOMPILER 'PL/pgSQL';
CREATE

причём без С не обойтись на сколько я понимаю, может кто меня поправит.
можно писать функции и на Perl, Tcl, C, C++, SmallTalk и прочее лишь бы настроить это.
...
Рейтинг: 0 / 0
использование функций
    #32104170
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.commandprompt.com/ppbook/index.lxp?lxpwrap=c19610%2ehtm
вот здесь приведены примеры, как добавить PL/pgsql надеюсь понятно


Example 11-1. Creating the PL/pgSQL call handler

booktown=# CREATE FUNCTION plpgsql_call_handler ()
booktown-# RETURNS OPAQUE
booktown-# AS '/usr/local/pgsql/lib/plpgsql.so'
booktown-# LANGUAGE 'C';
CREATE

Example 11-2. Adding PL/pgSQL with CREATE LANGUAGE

booktown=# CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler
booktown-# LANCOMPILER 'PL/pgSQL';
CREATE

причём без С не обойтись на сколько я понимаю, может кто меня поправит.
можно писать функции и на Perl, Tcl, C, C++, SmallTalk и прочее лишь бы настроить это.
...
Рейтинг: 0 / 0
использование функций
    #32104224
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ж говорю... сам PL\pgSQL уже подрублен таким макаром

удевляет само заявление парсера при попытке вызвать функцию
что мол вы вызываете функцию с первым параметром integer
а второй и третий unknown

ща приведу дословно

# SELECT myfunc (1,'para1','para2') ;

Function myfunc (integer, "unknown", "unknown") does not exist
Unable to identify function that satisfies the given argument types
You may need to add explicit typecast

:(
Но она создана!!!
Вот такая бяка
...
Рейтинг: 0 / 0
использование функций
    #32104374
goodwarlock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что за версия постгреса? В последних вроде отключили автоприведение, так что нужно указывать 'some'::text в параметрах.
...
Рейтинг: 0 / 0
использование функций
    #32104402
SSY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и правда, прокатывает только так:

Код: plaintext
select myfunc( 100 ::int2, 'qqq'::name, 'www'::text)


PostgreSQL 7.3.1

НО!!! Если определить функцию как

Код: plaintext
myfunc2(integer, varchar, varchar)


то всё работает и без явного приведения типов.
Вероятно, это издержки появления доменов. Точно не знаю, буду искать.
...
Рейтинг: 0 / 0
использование функций
    #32104774
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
версия 7.3.2

Действительно прокатило
Неожиданно!!!

Большое всем спасибо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
использование функций
    #32819971
MindSlayer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, а вот с 7.4.6 никак не разберусь ;\

Код: plaintext
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 "hostel"."st" (timestamp, varchar, varchar, integer, varchar, integer, varchar, varchar, integer, integer) 
RETURNS numeric AS'

declare
 dt      alias for $1;
 dmac    alias for $2;
 dip     alias for $3;
 dp      alias for $4;

 sip     alias for $5;
 sp      alias for $6;
 dns     alias for $7;
 prot    alias for $8;
 lbytes  alias for $9;
 bytes   alias for $10;

begin
 insert into hostel.traffic(dt, dstmac, dip, dport, sip, sport, dnsname, proto, lbytes, bytes)
                            values(dt, dmac, dip, dp, sip, sp, dns, prot, lbytes, bytes);
 return 0;
end;
'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
пробовал вызывать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
select hostel.st(to_timestamp('01/01/2004 13:02:55', 'DD/MM/YYYY hh24:mi:ss'), 
'00:50:22:a4:26:5d'::varchar, 
'192.168.0.249'::varchar,  1250 , 
'66.22.55.65'::varchar,  777 , 
'somewhere.in.da.inter.net.ru'::varchar, 
'tcp'::varchar,  74 ,  20 )
и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
select hostel.st(to_timestamp('01/01/2004 13:02:55', 'DD/MM/YYYY hh24:mi:ss'), 
'00:50:22:a4:26:5d', 
'192.168.0.249',  1250 , 
'66.22.55.65',  777 , 
'somewhere.in.da.inter.net.ru', 
'tcp',  74 ,  20 )

Один хрен, не работает... =(((
...
Рейтинг: 0 / 0
использование функций
    #32822020
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как ругается , а то параметров много - непонятно на что ругается..
...
Рейтинг: 0 / 0
использование функций
    #32827262
MindSlayer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ругается стандартно:
Function ..................... does not exist
Unable to identify function that satisfies the given argument types
You may need to add explicit typecast
...
Рейтинг: 0 / 0
использование функций
    #32827438
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MindSlayerРугается стандартно:
Function ..................... does not exist
Unable to identify function that satisfies the given argument types
You may need to add explicit typecast
1. вот в этом ..... находится список типов аргументов. Проверьте что _все_ типы совпадают с определением ф-ии. В частности таймстампы бывают разные - "местные" и нет (правда между ними кажется должно работать автоприведение типов). какой тип по умолчанию родит ф-я to_timestamp - надо смотреть.
(тупо кастните _все_ выражения в требуемые типы (в т.ч. 0::ineger). Если ф-я не нашлась - причина не в привидении типов).

2. Схема, для которой определена ф-я может не читаться (не определна как USAGE для вашего юзера).
...
Рейтинг: 0 / 0
использование функций
    #32828064
MindSlayer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, по-порядку:
Функция:
Код: 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.
CREATE OR REPLACE FUNCTION "hostel"."st" (
timestamp, 
varchar, 
varchar, 
integer, 
varchar, 
integer, 
varchar, 
varchar, 
integer, 
integer) RETURNS numeric AS'

declare
 dt      alias for $1;
 dmac    alias for $2;
 dip     alias for $3;
 dp      alias for $4;

 sip     alias for $5;
 sp      alias for $6;
 dns     alias for $7;
 prot    alias for $8;
 lbytes  alias for $9;
 bytes   alias for $10;

begin
 insert into hostel.traffic(dt, dstmac, dip, dport, sip, sport, dnsname, proto, lbytes, bytes)
                            values(dt, dmac, dip, dp, sip, sp, dns, prot, lbytes, bytes);
 return 0;
end;
'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Этап №1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select "hostel"."st" (
to_timestamp('2004/01/01 13:02:55', 'YYYY/MM/DD hh24:mi:ss'),
'00:50:22:a4:26:5d',
'192.168.0.249',
 1250 ,
'66.22.55.65',
 777 ,
'somewhere.in.da.inter.net.ru',
'tcp',
 74 ,
 20 
)
Результат:
ERROR: function hostel.st(timestamp with time zone, "unknown", "unknown", integer,
"unknown", integer, "unknown", "unknown", integer, integer) does not exist
HINT: No function matches the given name and argument types. You may need to add explicit type casts.

Этап №2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select "hostel"."st" (
to_timestamp('2004/01/01 13:02:55', 'YYYY/MM/DD hh24:mi:ss'),
'00:50:22:a4:26:5d'::varchar,
'192.168.0.249'::varchar,
 1250 ,
'66.22.55.65'::varchar,
 777 ,
'somewhere.in.da.inter.net.ru'::varchar,
'tcp'::varchar,
 74 ,
 20 
)
Результат:
ERROR: function hostel.st(timestamp with time zone, character varying, character varying,
integer, character varying, integer, character varying, character varying, integer, integer) does not exist
HINT: No function matches the given name and argument types. You may need to add explicit type casts.
...
Рейтинг: 0 / 0
использование функций
    #32828079
MindSlayer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ. права на фанкшу пользователю прописаны... ;\
...
Рейтинг: 0 / 0
использование функций
    #32828138
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MindSlayer Этап №2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select "hostel"."st" (
to_timestamp('2004/01/01 13:02:55', 'YYYY/MM/DD hh24:mi:ss'),
'00:50:22:a4:26:5d'::varchar,
'192.168.0.249'::varchar,
 1250 ,
'66.22.55.65'::varchar,
 777 ,
'somewhere.in.da.inter.net.ru'::varchar,
'tcp'::varchar,
 74 ,
 20 
)
Результат:
ERROR: function hostel.st(timestamp with time zone, character varying, character varying,
integer, character varying, integer, character varying, character varying, integer, integer) does not exist
HINT: No function matches the given name and argument types. You may need to add explicit type casts.

to_timestamp возвращает тип timestampz,
timestamp<>timestampz
т.ч. сделай явное преобразование(to_timestamp('2004/01/01 13:02:55', 'YYYY/MM/DD hh24:mi:ss'))::timestamp
и не поленись сделать 777::integer (хотя по умолчанию числа все равно распознаются как int4). И тогда можешь быть уверенным, что все пучком (не нашло ф-ии - ищи другие причины, кроме вызовов).

если проблема в timestampz, то доопредели:
CREATE OR REPLACE FUNCTION hostel.st (timestampz, varchar, varchar, integer, varchar, integer, varchar, varchar, integer, integer)
RETURNS numeric AS'
SELECT hostel.st ($1::timestamp, $2, $3, $4, $5, $6, $7, $8, $9, $10);
'
LANquage 'SQL' VOLATILE ....

и вызывай бе явного каста.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
использование функций
    #34138833
rossMoHaX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знатоки! Помогите, уже все глаза прожег выискивая где ошибка =( Создал функцию, создал тестовую функцию которая вызывает нужную мне (потому как из голого SQL не понял как в функцию передавать параметры объявленные как OUT). Ошибка такая-же как у всех тут присутствующих:

ERROR: функция sqlstat.startmission(character varying, integer) не существует
HINT: No function matches the given name and argument types. You may need to add explicit type casts.
CONTEXT: SQL-команда: "SELECT sqlstat.startmission ( $1 , $2 )"
PL/pgSQL function "testfunc" line 6 at perform

Вот сам код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION sqlstat.startmission (infile varchar( 255 ), OUT idvalue sqlstat.mission.id%TYPE) 
AS $$
BEGIN
INSERT INTO sqlstat.mission (id, file, started) VALUES (default, infile, now());
idvalue := lastval();
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION sqlstat.testfunc () RETURNS sqlstat.mission.id%TYPE
AS $$ 
DECLARE
param1 sqlstat.mission.id%TYPE;
param2 varchar( 255 ) := 'zhopa';
BEGIN
PERFORM sqlstat.startmission (param2, param1);
RETURN param1;
END;
$$ LANGUAGE plpgsql;

SELECT * FROM sqlstat.testfunc();

Версия Postgresql 8.1.5 под linux. редактирую/выполняю все в pgadmin3
надеюсь на вас :)
...
Рейтинг: 0 / 0
использование функций
    #34139297
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rossMoHaX
Вот сам код:
Код: plaintext
1.
2.
3.
4.
CREATE OR REPLACE FUNCTION sqlstat.startmission (infile varchar( 255 ), OUT idvalue sqlstat.mission.id%TYPE) 


PERFORM sqlstat.startmission (param2, param1);


Potomu chto functsiu s OUT parametrami nado vyzyvat' vot tak (argument doljen byt' odin!):
Код: plaintext
1.
select * from  sqlstat.startmission ('something')

Sootvetstvenno v vashem konkretnom primere vam nado sdelat'
Код: plaintext
1.
SELECT INTO param1 sqlstat.startmission (param2);
...
Рейтинг: 0 / 0
использование функций
    #34139305
rossMoHaX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СергейК[quot rossMoHaX]
Potomu chto functsiu s OUT parametrami nado vyzyvat' vot tak (argument doljen byt' odin!):


Ого! Спасибо огромное! Что то упустил я этот момент в документации =( Как тогда вызывать функцию у которой несколько разных OUT параметров?
...
Рейтинг: 0 / 0
использование функций
    #34139386
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rossMoHaX
Ого! Спасибо огромное! Что то упустил я этот момент в документации =( Как тогда вызывать функцию у которой несколько разных OUT параметров?
Pojaluista :)

Nu v obychnom SQL'e
Код: plaintext
select * from your_function()

a v PL/pgSQL nado delat'
Код: plaintext
SELECT INTO your_variable * from your_function()
gde your_variable -- eto peremennaia tipa record, i potom s nei rabotat' ispolzuia syntaxis "your_variable.your_field"
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / использование функций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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