Làm thế nào để phân biệt giữa SQL và PL / SQL?


16

Tôi biết câu hỏi nghe có vẻ quá ngu ngốc, nhưng tôi chưa bao giờ hiểu phần này.

SQL * Plus hoạt động với cả SQL và PL / SQL. Làm thế nào để tôi biết liệu một số mã là SQL hoặc PL / SQL? Nếu mã của tôi có một vòng lặp for, nó không phải là SQL nữa?

PL / SQL là một phần mở rộng để SQL có các vòng lặp, điều kiện, v.v ... Vậy mã SQL nào có phải là mã PL / SQL mặc định không? Có phải vậy không?

Có ranh giới giữa SQL và PL / SQL không?

Hai ví dụ về phân biệt b / w SQL và PL / SQL đã kích hoạt câu hỏi này:

Sự khác biệt giữa hai tạo bảng này là gì?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

Câu trả lời:


12

Đó là một câu hỏi thú vị, để chắc chắn. Hầu hết những người quen thuộc với sự phát triển của Oracle sẽ không suy nghĩ gì nhưng khi bạn tìm hiểu về nó, đôi khi thật khó hiểu khi xác định ranh giới giữa SQL và PL / SQL.

Bằng cách xem định nghĩa của các từ viết tắt, bạn bắt đầu có ý tưởng về các lĩnh vực chức năng của mỗi trang bìa:

SQL - Ngôn ngữ truy vấn có cấu trúc

PL / SQL - Ngôn ngữ thủ tục / Ngôn ngữ truy vấn có cấu trúc

Người đọc quan sát có thể nhận thấy cách SQL hiển thị hai lần 8) Đó là vì SQL thường được nhúng trong PL / SQL - PL / SQL là ngôn ngữ được tạo ra để cung cấp ngôn ngữ thế hệ thứ 4 (4GL) độc quyền chơi rất tốt với các đối tượng cơ sở dữ liệu trong Oracle.

Wikipedia có một số tài liệu khá tốt về cả SQLPL / SQL

Phần khó hiểu là nơi PL / SQL và SQL chồng chéo lên nhau một chút. Mục đích của SQL bao gồm chèn dữ liệu, truy vấn, cập nhật và xóa, cái gọi là DML hoặc các hoạt động ngôn ngữ thao tác dữ liệu, nhưng nó cũng bao gồm tạo, thay đổi, đổi tên, thả là DDL hoặc hoạt động ngôn ngữ định nghĩa dữ liệu. Đây là nơi mà một số có thể bị nhầm lẫn. Hoạt động để tạo một thủ tục được lưu trữ, một cái gì đó được viết bằng PL / SQL, thực ra là SQL - bạn sử dụng SQL để tạo đối tượng cơ sở dữ liệu đại diện cho một khối PL / SQL.

Tương tự như vậy, bạn có thể nhúng mã SQL bên trong PL / SQL của mình. Ví dụ, một vòng lặp FOR trong PL / SQL có thể dựa trên truy vấn SQL. Thổi tâm trí của bạn một chút, eh? Bạn tạo một thủ tục bằng SQL thực sự sử dụng SQL để thực hiện một số hành động đối với các bản ghi từ cơ sở dữ liệu.

Công cụ tuyệt vời nếu bạn hỏi tôi.


2
Thật vậy, dòng bị mờ. Bạn có thể viết một câu lệnh SQL để tạo một thủ tục PL / SQL có câu lệnh SQL trong đó gọi hàm PL / SQL có câu lệnh SQL trong đó, v.v.
Leigh Riffel

1
@Leigh xuống lỗ thỏ chúng tôi đi!
ScottCher

Tôi sẽ không nói rằng dòng này đã bị mờ đi. PL / SQL là trình bao bọc thủ tục cho SQL. Hầu hết PL / SQL chứa các câu lệnh SQL, mặc dù nó không phải. Bạn có thể theo dõi các con trỏ SQL thực tế, v$sqlv.v.
William Robertson

12

Nếu nó được bọc trong

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Là một tiền tố một lót EXECUTE

Sau đó, nó là PL / SQL. Điều này có nghĩa là gì dưới mui xe? SQL được "biên dịch" thành một kế hoạch truy vấn và được thực thi, ngay lập tức trả về một tập kết quả trong trường hợp SELECThoặc số lượng hàng bị ảnh hưởng trong các trường hợp khác hoặc xảy ra lỗi. PL / SQL tuy nhiên có liên quan nhiều hơn. Mọi đối tượng được tham chiếu trong nó đều được kiểm tra sự tồn tại và các khoản trợ cấp cần thiết, sau đó PL / SQL được biên dịch thành mã gần gốc , thực thi ở tốc độ tối đa. Các phụ thuộc được theo dõi và nếu một bảng thay đổi, thì bất kỳ tham chiếu PL / SQL nào cũng cần phải biên dịch lại. Lý do cho điều này là tốc độ; do mọi thứ được hoàn thành trước thời gian biên dịch, không cần phải có bất kỳ kiểm tra thời gian chạy nào trong PL / SQL, trong khi các câu lệnh SQL phải được kiểm tra mỗi lần (ngay cả các kế hoạch truy vấn của tho được lưu trữ, cái gọi là phân tích mềm, các đặc quyền vẫn phải được kiểm tra và ngay cả một phân tích mềm cũng có chi phí liên quan đến nó).

Đây là một trong những "lợi thế sát thủ" của các thủ tục được lưu trữ như Oracle thực hiện chúng; trên thực tế, việc thực hiện một Proc hoặc kích hoạt được lưu trữ PL / SQL thực hiện số lượng tính toán tối thiểu tuyệt đối để có kết quả. Mã ứng dụng chạy bên ngoài nhân Oracle nơi không đáng tin cậy phải nhảy qua nhiều vòng để lấy dữ liệu. Đó là lập luận tương tự cho các ngôn ngữ cấp cao được đánh máy mạnh mẽ, có tính tham chiếu như OCaml hoặc Haskell - thực hiện nhiều công việc hơn một lần, vào thời gian biên dịch và gặt hái lợi ích trong hàng triệu lần mã được thực thi.


2
Để thêm vào hỗn hợp CALL là một câu lệnh SQL được sử dụng để thực thi một đơn vị chương trình được lưu trữ và được viết lại dưới phần dưới dạng BEGIN ... END
Gary

2
Như EXECUTE, đó là đường cú pháp
Gaius

5

Có ranh giới giữa SQL và PL / SQL không?

SQL là một tiêu chuẩn *.

PL / SQL là phần mở rộng của nhà cung cấp theo tiêu chuẩn SQL *.

* SQL là một ngôn ngữ có một ngữ pháp rõ ràng và các quy tắc về cách thức ngữ pháp cần được thực hiện, và là nhưng không phải là một tiêu chuẩn mỗi-se . Tuy nhiên, vì có một đặc tả ngôn ngữ, mọi người đều có thể đồng ý, nên mọi thứ được viết bằng SQL sẽ có thể mang theo nếu chương trình chỉ được viết bằng SQL.

Nhưng vì PL / SQL là một phần mở rộng của nhà cung cấp, nó sẽ có các phần ngôn ngữ mà các nhà cung cấp khác có thể không hỗ trợ.


3
Tôi muốn nói rằng PL / SQL là một tiêu chuẩn thực tế, trong khi SQL là một tiêu chuẩn de jure :-)
Gaius

3
@Gaius và từ tuyên bố đó một mình tôi sẽ đoán hai điều: Bạn là nhà phát triển ORA và bạn nghĩ TSQL chỉ là
mớ

@jcolebrand Công việc DBA đầu tiên của tôi thực sự là trên Sybase, nhưng bạn nói đúng, tôi chủ yếu làm việc với Oracle những ngày này. Tôi sẽ rất vui nếu bạn có thể viết T-SQL hoặc PL / SQL trên cơ sở dữ liệu, nhưng các ngôn ngữ phản ánh nền tảng của chúng (ví dụ: T-SQL là như vậy bởi vì con trỏ và khóa đắt tiền trong SQL Server và hậu duệ của nó và PL / SQL là như vậy bởi vì ai đó ở Oracle đã làm việc lần cuối tại DoD) :-)
Gaius

@Gaius Ah, vâng, lập luận cũ về các tiêu chuẩn rất tốt bởi vì có rất nhiều lựa chọn. Tôi nghĩ thật tốt khi chỉ ra SQL là "tiêu chuẩn" và PL / SQL là độc quyền nên +1 @jcolebrand.
ScottCher

@ScottCher ~ Cảm ơn vì điều đó. Tôi cảm thấy ngớ ngẩn khi nói rằng đó là một tiêu chuẩn bởi vì không có (afaik) một cơ quan tiêu chuẩn để đóng dấu nó với một con dấu phê duyệt và đưa ra một con số. Nhưng nó được xác định rõ và đồng ý. ;)
jcolebrand
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.