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

Връщане на множество полета като запис в PostgreSQL с PL/pgSQL

Не използвайте CREATE TYPE, за да върнете полиморфен резултат. Вместо това използвайте и злоупотребявайте с типа RECORD. Вижте го:

CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$
DECLARE 
  ret RECORD;
BEGIN
  -- Arbitrary expression to change the first parameter
  IF LENGTH(a) < LENGTH(b) THEN
      SELECT TRUE, a || b, 'a shorter than b' INTO ret;
  ELSE
      SELECT FALSE, b || a INTO ret;
  END IF;
RETURN ret;
END;$$ LANGUAGE plpgsql;

Обърнете внимание на факта, че по желание може да върне две илитри колони в зависимост от въвеждането.

test=> SELECT test_ret('foo','barbaz');
             test_ret             
----------------------------------
 (t,foobarbaz,"a shorter than b")
(1 row)

test=> SELECT test_ret('barbaz','foo');
             test_ret             
----------------------------------
 (f,foobarbaz)
(1 row)

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

CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$
DECLARE 
  ret RECORD;
BEGIN
  -- Note the CASTING being done for the 2nd and 3rd elements of the RECORD
  IF LENGTH(a) < LENGTH(b) THEN
      ret := (TRUE, (a || b)::TEXT, 'a shorter than b'::TEXT);
  ELSE
      ret := (FALSE, (b || a)::TEXT, NULL::TEXT);
   END IF;
RETURN ret;
END;$$ LANGUAGE plpgsql;

Почти до епична горещина:

test=> SELECT test_ret('foobar','bar');
   test_ret    
----------------
 (f,barfoobar,)
(1 row)

test=> SELECT test_ret('foo','barbaz');
             test_ret             
----------------------------------
 (t,foobarbaz,"a shorter than b")
(1 row)

Но как да разделите това на няколко реда, така че избраният от вас ORM слой да може да преобразува стойностите в родните типове данни на избрания от вас език? Горещината:

test=> SELECT a, b, c FROM test_ret('foo','barbaz') AS (a BOOL, b TEXT, c TEXT);
 a |     b     |        c         
---+-----------+------------------
 t | foobarbaz | a shorter than b
(1 row)

test=> SELECT a, b, c FROM test_ret('foobar','bar') AS (a BOOL, b TEXT, c TEXT);
 a |     b     | c 
---+-----------+---
 f | barfoobar | 
(1 row)

Това е една от най-готините и най-малко използваните функции в PostgreSQL. Моля, разпространете информацията.



  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 към отдалечена база данни чрез pgAdmin

  2. Изберете произволен ред за всяка група

  3. Ремонт на Postgresql след надстройка до OSX 10.7 Lion

  4. Ред на PostgreSQL array_agg

  5. Картографиране на масив с Hibernate