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

Незадължителен аргумент във функцията PL/pgSQL

Тъй като PostgreSQL 8.4 (който изглежда използвате), има стойности по подразбиране за параметрите на функцията . Ако поставите параметъра си последен и предоставите стойност по подразбиране, можете просто да го пропуснете от повикването:

CREATE OR REPLACE FUNCTION foofunc(_param1 integer
                                 , _param2 date
                                 , _ids    int[] DEFAULT '{}')
  RETURNS SETOF foobar         -- declare return type!
  LANGUAGE plpgsql AS
$func$
BEGIN  -- required for plpgsql
   IF _ids <> '{}'::int[] THEN  -- exclude empty array and NULL
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2
      AND    id = ANY(_ids);    -- "IN" is not proper syntax for arrays
   ELSE
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2;
   END IF;
END  -- required for plpgsql
$func$;

Основни точки:

  • Ключовата дума DEFAULT се използва за деклариране на параметри по подразбиране. Кратка алтернатива:= .

  • Премахнах излишния param1 от разхвърляния пример.

  • Тъй като връщате SELECT * FROM foobar , декларирайте типа на връщане като RETURNS SETOF foobar вместо RETURNS SETOF record . Последната форма с анонимни записи е много тромава, ще трябва да предоставяте списък с дефиниции на колони при всяко обаждане.

  • Използвам масив от цяло число (int[] ) като параметър на функция. Адаптиран IF израз и WHERE клауза съответно.

  • IF операторите не са налични в обикновен SQL. Трябва да е LANGUAGE plpgsql за това.

Обаждане със или без _ids :

SELECT * FROM foofunc(1, '2012-1-1'::date);

На практика същото:

SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);

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

Обаждане от друга функция:

CREATE FUNCTION foofuncwrapper(_param1 integer, _param2 date)
  RETURNS SETOF foobar
  LANGUAGE plgpsql AS
$func$
DECLARE
   _ids int[] := '{1,2,3}';
BEGIN
   -- whatever

   RETURN QUERY
   SELECT * FROM foofunc(_param1, _param2, _ids);
END
$func$;


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

  2. Важна ли е позицията на колоната с идентификатор в Postgresql?

  3. Какъв е най-бързият начин за съкращаване на времеви печати до 5 минути в Postgres?

  4. Търсене в пълен текст от PostgreSQL 8.3

  5. Връзката е отказана (PGError) (postgresql и rails)