Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция в функции PostgreSQL с разными типами данных / 9 сообщений из 9, страница 1 из 1
27.02.2015, 00:40:50
    #38890104
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
Привет всем. Есть функция, которая делит одно число на другое. Необходимо, если второй параметр равен нулю, то выводить сообщение об ошибке с помощью другой функции. Возможно ли это?

Функция деления:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION public.print (cif real, cit real)
RETURNS  REAL AS
  $body$ 
DECLARE
 result real;
BEGIN

IF (cit = 0)
then
  SELECT msg('Ошибка!');
end if;

result = cif / cit;

RETURN result; 
END; 
$body$ 
LANGUAGE 'plpgsql';



Функция вывода сообщения:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION msg(msgerror character varying)
  RETURNS character varying AS
$BODY$ 
BEGIN
  RETURN MsgError; 
END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1;
ALTER FUNCTION msg(character varying)
  OWNER TO postgres;



Первая функция успешно создана. Но если выполнить:
Код: plsql
1.
SELECT public.print (1,0)



То получаю ошибку:
ОШИБКА: в запросе нет назначения для данных результата
HINT: Если вам нужно отбросить результаты SELECT, используйте PERFORM.
CONTEXT: функция PL/pgSQL print(real,real), строка 8, оператор SQL-оператор
********** Ошибка **********

ОШИБКА: в запросе нет назначения для данных результата
SQL-состояние: 42601
Подсказка: Если вам нужно отбросить результаты SELECT, используйте PERFORM.
Контекст: функция PL/pgSQL print(real,real), строка 8, оператор SQL-оператор


Я понимаю, что тип функции другой и не совпадает. Пробовал ещё так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION public.print (cif real, cit real)
RETURNS  REAL AS
  $body$ 
DECLARE
 result real;
BEGIN

IF (cit = 0)
then
  Return( msg('Ошибка!') );
end if;

result = cif / cit;

RETURN result; 
END; 
$body$ 
LANGUAGE 'plpgsql';



Но функция должна возвращать REAL. Как быть? Подскажите пожалуйста.
...
Рейтинг: 0 / 0
27.02.2015, 00:44:58
    #38890108
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
enakenenaken,

Код: sql
1.
PERFORM msg('Ошибка!');
...
Рейтинг: 0 / 0
27.02.2015, 00:46:34
    #38890109
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
Функцию `msg()` я бы сделал возвращающую `void`, а в ней бы делал `RAISE EXCEPTION`.
...
Рейтинг: 0 / 0
27.02.2015, 00:58:25
    #38890114
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
vyegorov,

Если честно, не понятно. Пробую так. Не выводит ничего. А зачем void? Ведь void ничего вообще не возвращает. Что я не так понял?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE FUNCTION public.print (cif real, cit real)
RETURNS  REAL AS
  $body$ 
DECLARE
 result real;
BEGIN

IF (cit = 0)
then
  PERFORM msg('Ошибка!');
ELSE
result = cif / cit;
END IF;

RETURN result; 

END; 
$body$ 
LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
27.02.2015, 01:19:36
    #38890117
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
vyegorov,

В общем вот что получилось. А select никак нельзя? Ну или просто вывести ячейку с текстом?
Чтобы клиентская программа могла её забрать.

Код: plsql
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.
CREATE OR REPLACE FUNCTION public.print (cif real, cit real)
RETURNS  REAL AS
  $body$ 
DECLARE
 result real;
BEGIN

IF (cit = 0)
then
  PERFORM msg();
ELSE
result = cif / cit;
END IF;

RETURN result; 

END; 
$body$ 
LANGUAGE 'plpgsql';

SELECt public.print(1,0)

/************************************/

CREATE OR REPLACE FUNCTION msg()
  RETURNS VOID AS
$BODY$ 
BEGIN

  RAISE EXCEPTION 'Деление на ноль!';

  RETURN; 
  
END; 
$BODY$
  LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
27.02.2015, 01:20:14
    #38890118
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
vyegorov,

Спасибо за помощь!
...
Рейтинг: 0 / 0
27.02.2015, 02:14:05
    #38890132
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
enakenenaken,

зачем вам вторая функция? Можно же перехватить исключение прямо в функции print() и выдать все то же самое, что вы делаете в msg(). Хотя зачем это делать, когда можно научить вашу клиентскую программу обрабатывать сообщение «ОШИБКА: деление на ноль» от базы?
...
Рейтинг: 0 / 0
27.02.2015, 10:03:32
    #38890247
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
Ы,

А что если я хочу таблицу со своими кодами ошибок? В датасетах в будущем я могу получить её легко selectом.
...
Рейтинг: 0 / 0
27.02.2015, 14:46:11
    #38890671
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в функции PostgreSQL с разными типами данных
enakenenaken,

перехватываете в функции стандартное исключение и выбрасываете наружу свое с нужным кодом, который в приложении ловите чем-то вроде pg_last_error() в PHP.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция в функции PostgreSQL с разными типами данных / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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