Nhận quyền chính xác và tạo các đối tượng vĩnh viễn là cách tiếp cận tốt nhất. Có vẻ như chế độ xem này sẽ chỉ được sử dụng trong một tập lệnh duy nhất, điều này không nhất thiết khiến việc tạo nó trở nên kém hợp lệ hơn, nhưng bạn có thể thấy khó biện minh hơn tùy thuộc vào DBA và chính sách của mình. Chắc chắn bạn nên thử cách tiếp cận đó, như @DCookie đã đề xuất.
Nếu không thành công thì có thể có các cách giải quyết hack, tùy thuộc vào ứng dụng khách mà bạn sẽ chạy tập lệnh này.
Ví dụ:trong SQL * Plus thì có thể lạm dụng biến thay thế
để có được một cái gì đó gần với những gì bạn mô tả. Điều này sử dụng define
lệnh
để tạo một biến thay thế có chứa truy vấn 'view' và sau đó sử dụng biến đó bên trong WITH
mệnh đề. (Bạn không thể thay thế toàn bộ with
như thế này, nhưng nó có thể rõ ràng hơn dù sao). Tôi đã sử dụng một truy vấn giả tầm thường:
define tempview_query = 'SELECT * -
FROM dual -
UNION ALL -
SELECT * -
FROM dual'
WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
Khi tập lệnh được chạy, đầu ra được tạo ra là:
D
-
X
X
2 rows selected.
D
-
X
X
2 rows selected.
Tôi cũng đã thực hiện set verify off
để ẩn các thay thế, nhưng việc bật nó lên có thể mang tính hướng dẫn để xem điều gì đang xảy ra.
Chú ý dấu gạch ngang ở cuối mỗi dòng của truy vấn; đó là ký tự tiếp tục
và như define
tài liệu đề cập:
vì vậy truy vấn 'mới' được hiển thị bởi set verify on
sẽ có toàn bộ truy vấn chế độ xem của bạn trên một dòng (nếu bạn hiển thị nó). Khả thi là với một truy vấn đủ dài, bạn sẽ đạt đến một số giới hạn độ dài dòng nhưng hy vọng rằng bạn sẽ không đạt đến điểm đó (ngoại trừ bạn đã làm; xem bên dưới).
Bạn có thể làm điều tương tự trong SQL Developer, nhưng ở đó phần tiếp theo cần sử dụng hai dấu gạch ngang, vì vậy:
define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'
ngoại trừ nó không hoàn toàn giống với phần tiếp theo trong SQL * Plus; ở đây, định nghĩa phải kết thúc bằng dấu gạch ngang, nhưng nó không được thay thế theo cách mà tài liệu SQL * Plus mô tả - vì vậy, với một dấu gạch ngang duy nhất, định nghĩa hoạt động nhưng truy vấn kết thúc không hợp lệ. (Ít nhất là trong 4.2.0; có thể là lỗi ...) Bằng cách sử dụng hai dấu gạch ngang, định nghĩa nhiều dòng vẫn hoạt động, các dấu gạch ngang vẫn là một phần của truy vấn, nhưng chúng được coi là dấu nhận xét; vì vậy chúng làm cho truy vấn được thay thế trông kỳ lạ (một lần nữa, nếu bạn hiển thị nó) nhưng không ngừng hoạt động. Bạn sẽ không nhận thấy với set verify off
trừ khi ai đó nhìn vào v$sql
.
Nếu truy vấn của bạn vượt quá 240 ký tự - điều này có khả năng xảy ra trừ khi nó đủ tầm thường để lặp lại - bạn sẽ gặp một cái gì đó như:
string beginning "'SELECT * ..." is too long. maximum size is 240 characters.
Cả SQL * Plus và SQL Developer đều cho phép bạn đặt biến thay thế từ một truy vấn, sử dụng cột column ... new_value
lệnh
:
column tempalias new_value tempview_query
set termout off
select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;
set termout on
Truy vấn chọn văn bản của truy vấn chế độ xem của bạn dưới dạng một chuỗi; Tôi đã sử dụng cơ chế trích dẫn thay thế
, với []
là dấu phân cách, vì vậy bạn không phải thoát khỏi bất kỳ dấu ngoặc kép nào trong truy vấn chế độ xem. (Tất nhiên, bạn cần chọn một dấu phân tách không thể xuất hiện trong truy vấn). Cũng lưu ý rằng bạn không cần ký tự tiếp tục dòng nữa.
Văn bản mà truy vấn tạo ra có bí danh là tempalias
. Cột column
lệnh đặt tempview_query
biến thay thế cho bất kỳ biểu thức cột bí danh nào chứa. Việc sử dụng biến thay thế sau đó giống như trong các ví dụ trước.
WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
set termout
dòng chỉ ẩn truy vấn tạo đó; bạn có thể tạm thời bỏ qua off
để xem những gì truy vấn tạo ra và nó có khớp chính xác với truy vấn chế độ xem mà bạn mong đợi hay không.
Các máy khách khác có thể có các cơ chế tương tự, nhưng đó là hai cơ chế duy nhất mà tôi thực sự quen thuộc. Tôi có lẽ cũng nên nhắc lại rằng đây là một chút hack, và không phải là điều tôi nhất thiết phải giới thiệu ...