Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / использование функций / 20 сообщений из 20, страница 1 из 1
09.02.2003, 23:22
    #32103584
lionson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
Доброго здоровья всем!!!

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

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

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

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

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

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

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

ПС Postgresql 7.3.2
...
Рейтинг: 0 / 0
10.02.2003, 11:57
    #32103756
SSY
SSY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
Запости определение функции, а то не понятно даже на каком она языке.
...
Рейтинг: 0 / 0
10.02.2003, 17:44
    #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
10.02.2003, 18:55
    #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
10.02.2003, 18:55
    #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
10.02.2003, 21:58
    #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
11.02.2003, 10:56
    #32104374
goodwarlock
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
Что за версия постгреса? В последних вроде отключили автоприведение, так что нужно указывать 'some'::text в параметрах.
...
Рейтинг: 0 / 0
11.02.2003, 11:30
    #32104402
SSY
SSY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
Да, и правда, прокатывает только так:

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


PostgreSQL 7.3.1

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

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


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

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

Большое всем спасибо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
09.12.2004, 10:08
    #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
09.12.2004, 21:48
    #32822020
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
а как ругается , а то параметров много - непонятно на что ругается..
...
Рейтинг: 0 / 0
14.12.2004, 17:19
    #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
14.12.2004, 18:42
    #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
15.12.2004, 11:34
    #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
15.12.2004, 11:38
    #32828079
MindSlayer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
ЗЫ. права на фанкшу пользователю прописаны... ;\
...
Рейтинг: 0 / 0
15.12.2004, 11:58
    #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
Период между сообщениями больше года.
18.11.2006, 22:48
    #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
19.11.2006, 16:40
    #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
19.11.2006, 16:47
    #34139305
rossMoHaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование функций
СергейК[quot rossMoHaX]
Potomu chto functsiu s OUT parametrami nado vyzyvat' vot tak (argument doljen byt' odin!):


Ого! Спасибо огромное! Что то упустил я этот момент в документации =( Как тогда вызывать функцию у которой несколько разных OUT параметров?
...
Рейтинг: 0 / 0
19.11.2006, 18:02
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / использование функций / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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