PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да напиша функция, която връща текстови или целочислени стойности?

От какво вероятно се нуждаете

Най-вероятно имате нужда от една функция, за да върнете text и още един за връщане на integer или функция, която връща boolean за да покаже успех. Всичко това е тривиално и ще ви препратя към отличното ръководство за CREATE FUNCTION или примери за код в подобни въпроси на SO.

Какво всъщност попитахте

Как да напиша функция, която връща текстови или целочислени стойности?

... в смисъл, че имаме един типът на връщане е или text или integer . Не толкова тривиално, но и не невъзможно, както се предполагаше. Ключовата дума е:полиморфни типове .

Въз основа на тази проста таблица:

CREATE TABLE tbl(
  tbl_id int,
  txt    text,
  nr     int
);

Тази функция връща или цяло число, или текст (или друг тип, ако го разрешите), в зависимост от типа на въвеждане.

CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
  RETURNS anyelement AS
$func$
BEGIN

CASE pg_typeof(_data) 
WHEN 'text'::regtype THEN
    INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
    RETURNING txt
    INTO _result;

WHEN 'integer'::regtype THEN
    INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
    RETURNING nr
    INTO _result;

ELSE
    RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
END CASE;

END
$func$
LANGUAGE plpgsql;

Обадете се:

SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
SELECT f_insert_data(1, 7);

Прост случай

Едно функция, която връща TRUE / FALSE за да се посочи дали е вмъкнат ред, само един входен параметър от различен тип:

CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
  RETURNS boolean AS
$func$
BEGIN

CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
   INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);

WHEN 'integer'::regtype THEN
   INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);

ELSE
   RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
END CASE;

IF FOUND THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;

END
$func$
LANGUAGE plpgsql;

Типът на въвеждане може да бъде заменен с text параметър за повечето цели, който може да се прехвърля към и от всеки друг тип.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при създаване на разширение без акцент на PostgreSQL

  2. Вземете номера на седмицата от дата в PostgreSQL

  3. Изцяло игнориране на часовите зони в Rails и PostgreSQL

  4. Грешка в PostgreSQL:Фатално:потребителското име на ролята не съществува

  5. Как да получите текущата дата в PostgreSQL