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

Cách thực hiện hoạt động hàng loạt bằng pl / sql

Tôi chỉ sẽ nói rằng điều này là thô lỗ trước khi tôi bắt đầu. Nếu bạn đang tạo các tập lệnh để tự động tạo cơ sở dữ liệu, tôi sẽ bỏ truy vấn bên dưới và chỉ cần sao chép / dán vì điều này quá khủng khiếp, nó KHÔNG thuộc về các tập lệnh triển khai cơ sở dữ liệu của bạn.

Truy vấn

DECLARE
    CURSOR TABLES IS SELECT * FROM USER_TABLES
                     WHERE 0 = (SELECT COUNT(*)
                                FROM USER_CONSTRAINTS
                                WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
                                AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
                               );
BEGIN
    FOR T IN TABLES LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
        EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
        EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
        EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
                          ||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
                          ||'FOR EACH ROW '||CHR(10)
                          ||'BEGIN '||CHR(10)
                          ||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
                          ||'END; ';
    END LOOP;
END;
/

Điều này có tác dụng gì?

Về cơ bản, nó nhận một danh sách các bảng và tự động xây dựng SQL để thực hiện các tác vụ khác nhau liên quan. EXECUTE IMMEDIATE lấy chuỗi nơi chúng ta đã xây dựng SQL và thực thi nó. CHR(10) sự bẩn thỉu là một dòng mới. Tôi muốn có khoảng trắng trong đó vì tôi không biết việc bỏ nó ra ngoài sẽ ảnh hưởng đến việc phân tích cú pháp của Oracle như thế nào. Lưu ý rằng ở một số nơi, chúng tôi nối trực tiếp tên bảng với một số văn bản khác để tạo ra một chuỗi hoặc tên ràng buộc PK.

Điều này có thể xảy ra hoặc có thể không xảy ra nếu bạn đã trích dẫn tên bảng của mình trong quá trình tạo và sử dụng một số ký tự viết thường. Nếu nó KHÔNG xảy ra lỗi, hãy nhớ rằng mọi câu lệnh đều liên quan đến một cam kết. Một lỗi sẽ có nghĩa là quá trình đã hoàn thành một nửa. Nó cũng không thành công nếu lược đồ không phải là người dùng hiện tại. (Bạn sẽ cần thay đổi USER_TABLES thành ALL_TABLES và thêm một bộ lọc thích hợp trong mệnh đề where và thêm lược đồ vào trước tên bảng khi xây dựng SQL để làm cho nó hoạt động trên một lược đồ khác.)

SQLFiddle hoạt động thực tế: http://sqlfiddle.com/#!4/b67fc/1 (Tôi không thể tin rằng điều này thực sự hoạt động trên SQLFiddle.) Trong trường hợp này, truy vấn mà chúng tôi quan tâm đã kết thúc trong định nghĩa lược đồ vì SQL Fiddle chỉ cho phép SELECT trong truy vấn.

Chúc may mắn. Bạn sẽ cần đến nó. Đừng tự bắn vào chân mình.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:các vấn đề mã hóa có thể xảy ra khi nhập dữ liệu

  2. Mô phỏng truy vấn Oracle DB dài hạn

  3. chọn bản ghi từ oracle

  4. Giá trị từ hàng được chèn cuối cùng trong DB

  5. Phát hiện, xóa các cột trống và cập nhật cơ sở dữ liệu trong sql, oracle