Bạn không thể gọi RAISE
động (với EXECUTE
) trong PL / pgSQL - chỉ hoạt động cho các câu lệnh SQL và RAISE
là một lệnh PL / pgSQL.
Sử dụng chức năng đơn giản này để thay thế:
CREATE OR REPLACE FUNCTION f_raise(text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION '%', $1;
END
$func$;
Gọi:
SELECT f_raise('My message is empty!');
Có liên quan:
Câu trả lời bổ sung cho nhận xét
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$;
Gọi:
SELECT f_raise1('the','manual','educates');
-
VARIADIC
không phải là một loại dữ liệu, mà là một chế độ đối số . -
Các phần tử phải được xử lý giống như bất kỳ phần tử mảng nào khác.
-
Để sử dụng nhiều biến trong
RAISE
câu lệnh, đặt nhiều%
vào văn bản tin nhắn.
Ví dụ trên sẽ không thành công nếu không có $3
được thông qua. Bạn sẽ phải tập hợp một chuỗi từ số lượng phần tử đầu vào có thể thay đổi. Ví dụ:
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$;
Gọi:
SELECT f_raise2('the','manual','educates');
Tôi nghi ngờ bạn cần một VARIADIC
tham số cho điều này ở tất cả. Đọc hướng dẫn tại đây .
Thay vào đó, hãy xác định tất cả các tham số, có thể thêm giá trị mặc định:
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$;
Gọi:
SELECT f_raise3('the','manual','educates');
Hoặc:
SELECT f_raise3(); -- defaults kick in