powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция в функции PostgreSQL с разными типами данных
9 сообщений из 9, страница 1 из 1
Функция в функции PostgreSQL с разными типами данных
    #38890104
Фотография enakenenaken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем. Есть функция, которая делит одно число на другое. Необходимо, если второй параметр равен нулю, то выводить сообщение об ошибке с помощью другой функции. Возможно ли это?

Функция деления:
Код: 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
Функция в функции PostgreSQL с разными типами данных
    #38890108
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enakenenaken,

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

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

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

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

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


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