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

SQL động - Kiểm tra cú pháp và ngữ nghĩa

EXPLAIN PLAN sẽ kiểm tra cú pháp và ngữ nghĩa của hầu hết các loại câu lệnh SQL. Và không giống như DBMS_SQL.PARSE nó sẽ không thực thi bất cứ điều gì.

Mục đích của kế hoạch giải thích là chỉ ra cách Oracle sẽ thực thi một câu lệnh. Như một tác dụng phụ của việc tạo kế hoạch, nó cũng phải kiểm tra cú pháp, đặc quyền và thường làm mọi thứ ngoại trừ thực sự chạy câu lệnh. Bản thân kế hoạch giải thích là vô nghĩa và có thể bị bỏ qua, câu lệnh chỉ được chạy để kiểm tra bất kỳ lỗi nào. Miễn là không có lỗi, tuyên bố hợp lệ.

Ví dụ:các khối PL / SQL bên dưới kiểm tra tính hợp lệ của SELECT câu lệnh và CREATE TABLE bản tường trình. Chúng chạy không có lỗi nên cú pháp ổn.

begin
    execute immediate 'explain plan for select * from dual';
end;
/

begin
    execute immediate 'explain plan for create table just_some_table(a number)';
end;
/

Chạy một câu lệnh không hợp lệ sẽ tạo ra lỗi. Trong ít nhất một trường hợp thử nghiệm này, nó tạo ra lỗi giống như khi câu lệnh được chạy bởi chính nó.

begin
    execute immediate 'explain plan for select * from this_table_does_not_exist';
end;
/
ORA-00942: table or view does not exist
ORA-06512: at line 2

Sơ đồ cú pháp trong sách hướng dẫn ngụ ý rằng nó sẽ chạy cho tất cả các câu lệnh. Tuy nhiên, dường như có ít nhất một vài loại câu lệnh không hoạt động, chẳng hạn như ALTER SESSION .

begin
    execute immediate 'explain plan for alter session set optimizer_features_enable = ''11.2.0.4''';
end;
/
ORA-00900: invalid SQL statement
ORA-06512: at line 2

Hơi lạc đề - bạn đang cố gắng xây dựng một giao diện SQL hoàn toàn chung chung, giống như một SQL Fiddle riêng được xây dựng trong PL / SQL? Bạn có cần phải lo lắng về những thứ như ngăn người dùng cố gắng chạy một số loại câu lệnh nhất định và đảm bảo không có dấu chấm phẩy ở cuối không? Nếu vậy, tôi có thể chỉnh sửa câu hỏi để giúp giải quyết một số tác vụ SQL động khó khăn đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có LISTAGG WITHIN GROUP tương đương trong SQLAlchemy không?

  2. Không thể sử dụng các cột lọc từ nhật ký chế độ xem cụ thể hóa trên Bảng

  3. Làm thế nào tôi có thể chọn hồ sơ CHỈ từ ngày hôm qua?

  4. Làm thế nào để cấu hình DbContext để hoạt động với Oracle ODP.Net và EF CodeFirst?

  5. Oracle SQL - Mệnh đề IN hiển thị tất cả bản ghi được đưa ra trong điều kiện IN ngay cả khi dữ liệu không có trong bảng