PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tôi có thể tạo một hàm plpgsql trả về một số nguyên mà không cần sử dụng một biến không?

Có bạn có thể. Có một số cách.

1) RETURN (SELECT ...)

CREATE OR REPLACE FUNCTION get(_param_id integer)
  RETURNS integer AS
$func$
BEGIN
   RETURN (SELECT col1 FROM TABLE WHERE id = _param_id);
END
$func$  LANGUAGE plpgsql;

2) Sử dụng OUT hoặc INOUT tham số

CREATE OR REPLACE FUNCTION get(_param_id integer, OUT _col1 integer)
-- RETURNS integer -- "RETURNS integer" is optional noise in this case
  AS  
$func$
BEGIN
   SELECT INTO _col1  col1 FROM TABLE WHERE id = _param_id;

   -- also valid, but discouraged:
   -- _col1 := col1 FROM TABLE WHERE id = _param_id;
END
$func$  LANGUAGE plpgsql;

Xem thêm trong sách hướng dẫn tại đây.

3) (Ab) sử dụng IN tham số

Kể từ Postgres 9.0 bạn cũng có thể sử dụng tham số đầu vào dưới dạng các biến. Các ghi chú phát hành cho 9.0:

Giờ đây, một tham số đầu vào hoạt động giống như một biến cục bộ được khởi tạo thành giá trị được truyền vào.

CREATE OR REPLACE FUNCTION get(_param_id integer)
  RETURNS integer AS
$func$
BEGIN
   SELECT INTO _param1  col1 FROM TABLE WHERE id = _param1;
   RETURN _param1;

   -- Also possible, but discouraged:
   -- $1 := col1 FROM TABLE WHERE id = $1;
   -- RETURN $1;
END
$func$  LANGUAGE plpgsql;

Với những cái cuối cùng mà bạn thực sự sử dụng một biến ngầm định, nhưng bạn không cần phải DECLARE nó rõ ràng (theo yêu cầu).

4) Sử dụng DEFAULT giá trị bằng INOUT tham số

Đây là một trường hợp hơi đặc biệt. Phần thân hàm có thể để trống.

CREATE OR REPLACE FUNCTION get(_param_id integer, INOUT _col1 integer = 123)
  RETURNS integer AS
$func$
BEGIN
   -- You can assign some (other) value to _col1:
   -- SELECT INTO _col1  col1 FROM TABLE WHERE id = _param_id;
   -- If you don't, the DEFAULT 123 will be returned.
END
$func$  LANGUAGE plpgsql;

INOUT _col1 integer = 123 là ký hiệu ngắn gọn cho INOUT _col1 integer DEFAULT 123 . Thêm:

  • Toán tử gán bị quên "=" và điểm chung ":="

5) Sử dụng một hàm SQL thuần túy để thay thế

CREATE OR REPLACE FUNCTION get(_param_id integer)
  RETURNS integer AS
$func$
   SELECT col1 FROM TABLE WHERE id = _param_id;
   -- use positional reference $1 instead of param name in Postgres 9.1 or older
$func$  LANGUAGE sql;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tối ưu hóa truy vấn với OFFSET trên bảng lớn

  2. Postgres INTERVAL sử dụng giá trị từ bảng

  3. Chỉ mục để tìm một phần tử trong một mảng JSON

  4. Cách sửa LỖI:cột c.relhasoids không tồn tại trong Postgres?

  5. Dữ liệu dự phòng trong báo cáo cập nhật