Hàm Postgresql để tạo bảng


9

Tôi muốn tạo một hàm để tạo một bảng có cấu trúc cụ thể vượt qua một phần tên của bảng làm đối số để tên của bảng là t_. Tương tự như thế này:

CREATE OR REPLACE FUNCTION create_table_type1(t_name VARCHAR(30)) RETURNS VOID AS $$
BEGIN
    EXECUTE "CREATE TABLE IF NOT EXISTS t_"|| t_name ||"
    (
    id SERIAL,
    customerid INT,
    daterecorded DATE,
            value DOUBLE PRECISION,
    PRIMARY KEY (id)
    )"
END
$$ LANGUAGE plpgsql

Sau đó gọi nó như:

SELECT create_table_type1('one');

Có thể không?

Câu trả lời:


19

Trả lời là . :)

CREATE OR REPLACE FUNCTION create_table_type1(t_name varchar(30))
  RETURNS VOID AS
$func$
BEGIN

EXECUTE format('
   CREATE TABLE IF NOT EXISTS %I (
    id serial PRIMARY KEY,
    customerid int,
    daterecorded date,
    value double precision
   )', 't_' || t_name);

END
$func$ LANGUAGE plpgsql;

Tôi đang sử dụng format()với %Iđể vệ sinh tên bảng và tránh tiêm SQL. Yêu cầu PostgreSQL 9.1 trở lên.

Hãy chắc chắn sử dụng dấu ngoặc đơn ( '') cho dữ liệu. Dấu ngoặc kép ( "") dành cho mã định danh trong SQL.


Cảm ơn bạn một lần nữa, nó hoạt động nhưng bạn đã có một chút sai lầm. Nó phải là 'TẠO BẢNG NẾU KHÔNG EXISTS% I', phải không?
Alan Cor

@ user1350102: Phải, tên bảng đi sau IF NOT EXISTS . Cảm ơn, sửa đổi.
Erwin Brandstetter

@ErwinBrandstetter, chúng ta có thể sử dụng $$ ... $$ LANGUAGE plpgsql;thay thế $func$ ... $func$ LANGUAGE plpgsql;không? sự khác biệt giữa hai cái đó là gì? Có một tình huống mà một người thích hơn người khác? Tôi đang tự hỏi bởi vì tôi đã sử dụng trước đây.
dw8547

@ dw8547: Bạn có thể. Không có ý nghĩa. Nó chỉ là trích dẫn đô la. Xem: stackoverflow.com/questions/12144284/ Mạnh . Tôi sử dụng $func$thay vì chỉ $$cho rõ ràng và để tránh các vấn đề với trích dẫn đô la lồng nhau.
Erwin Brandstetter

2

vâng, điều này là có thể tuy nhiên, bạn phải cẩn thận một chút DDL trong một thủ tục lưu trữ USUALLY làm việc. trong một số trường hợp góc khó chịu, bạn có thể gặp phải lỗi "tra cứu bộ đệm". Lý do là một thủ tục về cơ bản là một phần của một tuyên bố và sửa đổi các đối tượng hệ thống đó một cách nhanh chóng trong các trường hợp góc hiếm gặp gây ra lỗi (phải có). Điều này không thể xảy ra với CREATE TABLE, tuy nhiên. Vì vậy, bạn nên an toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.