2013-03-05 29 views
6

Trong một khối Oracle PL/SQL, tại sao sql năng động cho phépTại sao ddl tĩnh không được phép trong PL/SQL?

begin 
    execute immediate 'drop table table_name'; 
end; 

nhưng tĩnh không?

begin 
    drop table table_name; 
end; 

Tôi hy vọng câu trả lời sâu sắc hơn "vì đó là cách ngôn ngữ hoạt động".

+1

Không tham chiếu đến suy nghĩ của nhóm thiết kế PL/SQL, tôi không nghĩ rằng chúng tôi có thể biết ** tại sao PL/SQL không cho phép DDL tĩnh. Chúng ta chỉ có thể thảo luận về điểm cộng và nhược điểm của cách tiếp cận và sẽ không có câu trả lời là ** câu trả lời **. –

+2

Tôi nghĩ rằng các câu trả lời cho đến nay chứng minh câu hỏi này là câu trả lời, được hỗ trợ bởi các sự kiện - và có thể xây dựng là tốt. –

+1

Jeffrey Kemp là chính xác, câu trả lời được chấp thuận cho thấy rằng câu hỏi này không nên được đóng lại - như rất nhiều người khác trên trang web, thật đáng buồn. –

Trả lời

9

Câu trả lời là PL/SQL không hỗ trợ đa hình động. nó chỉ hỗ trợ đa hình tĩnh vì

Tất cả các tướng PL/SQL là "DIANA" -> Ký hiệu phân bổ trung gian mô tả cho Ada, một ngôn ngữ trung gian có cấu trúc cây. DIANA được sử dụng trong nội bộ bởi trình biên dịch.

Tại thời gian biên dịch, mã nguồn PL/SQL được dịch sang mã hệ thống và tạo DIANA tương ứng. Bây giờ hãy nghĩ rằng nếu có một câu lệnh DDL như tạo câu lệnh bảng tại thời điểm biên dịch không tồn tại thì nó sẽ được tạo sau khi chạy chương trình. làm thế nào PL/SQL của bạn sẽ tạo ra một DIANA sau đó ????

DIANA đóng một vai trò quan trọng trong PL/SQL để kiểm tra/xác thực rằng chương trình con. điều này là bắt buộc bởi vì như chúng ta biết rằng một chương trình con có thể sử dụng các đối tượng cơ sở dữ liệu như Tables, Views, Synonyms hoặc procs được lưu trữ khác. có thể là các đối tượng có thể đã thay đổi/xóa/thả khi lần sau bạn chạy chương trình. Ví dụ: một số có thể đã thả bảng, proc được lưu trữ hoặc chức năng singnature có thể đã thay đổi.

Thats lý do tại sao PL/SQL thường được sử dụng để thao tác dữ liệu trong cấu trúc cơ sở dữ liệu, nhưng không thao túng các cấu trúc đó.

nhưng có nhiều cách để thao tác sử dụng gói SQL động và DBMS_SQL nhưng phương pháp luận này lại được sử dụng một cách thận trọng. Ví dụ: nếu bạn đang tạo Bảng, bạn nên kiểm tra trước nếu bảng này đã tồn tại hoặc không sử dụng chế độ xem từ điển dữ liệu.

+0

'_DDL tuyên bố như tạo bảng tuyên bố mà tại thời gian biên dịch không tồn tại_'. nhưng tại sao các câu lệnh DDL không phải là một phần của thời gian biên dịch? –

3

Có lẽ bởi vì nếu không một số mã sẽ như thế nào:

begin 
    create table tmp (n number); 
    insert into tmp values (1); 
    end; 

Và chúng tôi mong chờ các trình biên dịch để biết rằng tại thời điểm chèn, bàn tồn tại. Việc biên soạn khối sẽ khiến tôi khó khăn hơn nhiều. Đây là một trường hợp rất đơn giản, nhưng chúng ta có thể dễ dàng tưởng tượng một số nhánh có điều kiện và blabla phức tạp.

Nhưng, vì chúng ta cần phải đặt DDL trong khối thực thi ngay lập tức, giới hạn có thể dễ hiểu hơn bằng cách nào đó.

Chỉ cần một ý tưởng ...

Các vấn đề liên quan