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

Làm thế nào để viết một hàm trả về giá trị văn bản hoặc số nguyên?

Những gì bạn có thể cần

Nhiều khả năng bạn cần một hàm để trả về text và một số khác để trả về integer hoặc một hàm trả về boolean để biểu thị sự thành công. Tất cả những điều này thật tầm thường và tôi sẽ giới thiệu cho bạn hướng dẫn tuyệt vời về CREATE FUNCTION hoặc mã ví dụ trong các câu hỏi tương tự trên SO.

Những gì bạn thực sự đã hỏi

Làm cách nào để viết một hàm trả về giá trị văn bản hoặc số nguyên?

... theo nghĩa là chúng ta có một kiểu trả về là text hoặc integer . Không phải là tầm thường, nhưng cũng không phải là không thể như đã được đề xuất. Từ khóa là: loại đa hình .

Xây dựng trên bảng đơn giản này:

CREATE TABLE tbl(
  tbl_id int,
  txt    text,
  nr     int
);

Hàm này trả về số nguyên hoặc văn bản (hoặc bất kỳ kiểu nào khác nếu bạn cho phép), tùy thuộc vào kiểu đầu vào.

CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
  RETURNS anyelement AS
$func$
BEGIN

CASE pg_typeof(_data) 
WHEN 'text'::regtype THEN
    INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
    RETURNING txt
    INTO _result;

WHEN 'integer'::regtype THEN
    INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
    RETURNING nr
    INTO _result;

ELSE
    RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
END CASE;

END
$func$
LANGUAGE plpgsql;

Gọi:

SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
SELECT f_insert_data(1, 7);

Trường hợp đơn giản

Một hàm trả về TRUE / FALSE để cho biết một hàng đã được chèn hay chưa, chỉ một tham số đầu vào thuộc loại khác nhau:

CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
  RETURNS boolean AS
$func$
BEGIN

CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
   INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);

WHEN 'integer'::regtype THEN
   INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);

ELSE
   RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
END CASE;

IF FOUND THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;

END
$func$
LANGUAGE plpgsql;

Loại đầu vào có thể được thay thế bằng text cho hầu hết các mục đích, có thể được truyền đến và từ bất kỳ loại nào khác.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiểu các cột hệ thống trong PostgreSQL

  2. Chuyển tên bảng làm tham số trong psycopg2

  3. Đặt giá trị trong phần phụ thuộc của biểu đồ Helm

  4. Làm thế nào để xóa một giá trị kiểu enum trong postgres?

  5. Chuyển một hàng thành nhiều hàng với ít cột hơn