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

Как да изпълним командата PostgreSQL RAISE динамично

Не можете да извикате RAISE динамично (с EXECUTE ) в PL/pgSQL - това работи само за SQL изрази и RAISE е PL/pgSQL команда.

Вместо това използвайте тази проста функция:

CREATE OR REPLACE FUNCTION f_raise(text)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   RAISE EXCEPTION '%', $1;
END
$func$;

Обаждане:

SELECT f_raise('My message is empty!');

Свързани:

Допълнителен отговор към коментар

CREATE OR REPLACE FUNCTION f_raise1(VARIADIC text[])
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN 
   RAISE EXCEPTION 'Reading % % %!', $1[1], $1[2], $1[3];
END
$func$;

Обаждане:

SELECT f_raise1('the','manual','educates');
  • VARIADIC не е тип данни, а режим на аргумент .

  • Елементите трябва да се обработват като всеки друг елемент от масив.

  • За да използвате множество променливи в RAISE израз, поставете няколко % в текста на съобщението.

Горният пример ще се провали, ако няма $3 се преминава. Ще трябва да сглобите низ от променливия брой входни елементи. Пример:

CREATE OR REPLACE FUNCTION f_raise2(VARIADIC _arr text[]) 
  RETURNS void
  LANGUAGE plpgsql AS 
$func$  
DECLARE
   _msg text := array_to_string(_arr, ' and ');  -- simple string construction
BEGIN  
   RAISE EXCEPTION 'Reading %!', _msg;
END
$func$;

Обаждане:

SELECT f_raise2('the','manual','educates');

Съмнявам се, че имате нужда от VARIADIC параметър за това изобщо. Прочетете ръководството тук .
Вместо това дефинирайте всички параметри, може би добавете стойности по подразбиране:

CREATE OR REPLACE FUNCTION f_raise3(_param1 text = ''
                                  , _param2 text = ''
                                  , _param3 text = 'educates')
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   RAISE EXCEPTION 'Reading % % %!', $1, $2, $3;
END 
$func$;

Обаждане:

SELECT f_raise3('the','manual','educates');

Или:

SELECT f_raise3();  -- defaults kick in



  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. Postgres UPSERT използва повторно стойности на колони от INSERT на UPDATE

  3. Ограничение за изключване на колона от битов низ с побитов оператор И

  4. проблем с псевдонима на колоната на postgres

  5. Ръководство за разделяне на данни в PostgreSQL