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

Thay đổi lược đồ của nhiều hàm PostgreSQL trong một thao tác?

Bạn có thể tinh chỉnh thêm một số vòng lặp (chỉ trình bày chỉ truy vấn thứ hai ):

DO
$do$
DECLARE
    r   record;
    sql text = '';
BEGIN
    FOR r IN
        SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS params
        FROM   pg_proc p
        JOIN   pg_namespace n ON n.oid = p.pronamespace
        WHERE  nspname = 'public'
        -- and other conditions, if needed
    LOOP
        sql := sql
          || format(E'\nALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
                   ,r.proname, r.params);
    END LOOP;

    RAISE NOTICE '%', sql; -- for viewing the sql before executing it
    -- EXECUTE sql; -- for executing the sql
END
$do$;

Những điểm chính

  • Toán tử gán trong plpgsql là := . = hoạt động, nhưng không có giấy tờ.

  • Xóa các bảng không cần thiết khỏi FROM .

  • concat() có thể quá mức cần thiết, nhưng format() đơn giản hóa cú pháp.

Thay thế dựa trên tập hợp tốt hơn

Xử lý lại vấn đề vì hoạt động dựa trên tập hợp hiệu quả hơn. Một CHỌN với string_agg() thực hiện công việc:

DO
$do$
DECLARE
   sql text;
BEGIN
   SELECT INTO sql
          string_agg(format('ALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
                   ,p.proname, pg_get_function_identity_arguments(p.oid)), E'\n')
   FROM   pg_proc p
   JOIN   pg_namespace n ON n.oid = p.pronamespace
   WHERE  nspname = 'public';
      -- and other conditions, if needed

   RAISE NOTICE '%', sql; -- for viewing the sql before executing it
   -- EXECUTE sql; -- for executing the sql
END
$do$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bản ghi hoạt động:Truy vấn JSON

  2. Truy vấn SELECT đệ quy để trả về tỷ lệ có độ sâu tùy ý?

  3. Khóa ngoại của một trong nhiều bảng?

  4. Npgsql - Phương thức đã chỉ định không được hỗ trợ

  5. Cách kết nối với Postgres qua Node.js