Mendapatkan izin yang benar dan membuat objek permanen adalah pendekatan terbaik. Kedengarannya seperti tampilan ini hanya akan digunakan dalam satu skrip, yang tidak selalu membuatnya kurang valid untuk membuatnya, tetapi Anda mungkin merasa lebih sulit untuk membenarkannya tergantung pada DBA dan kebijakan Anda. Pendekatan itu tentu patut dicoba, seperti yang disarankan @DCookie.
Jika gagal maka mungkin ada solusi peretasan, tergantung pada klien tempat Anda menjalankan skrip ini.
Misalnya, di SQL*Plus mungkin menyalahgunakan variabel substitusi
untuk mendapatkan sesuatu yang dekat dengan apa yang Anda gambarkan. Ini menggunakan define
perintah
untuk membuat variabel substitusi yang berisi kueri 'tampilan', lalu menggunakan variabel tersebut di dalam WITH
ayat. (Anda tidak dapat mengganti seluruh with
seperti ini, tapi mungkin lebih jelas seperti ini). Saya menggunakan kueri dummy sepele:
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;
Saat script dijalankan output yang dihasilkan adalah:
D
-
X
X
2 rows selected.
D
-
X
X
2 rows selected.
Saya juga telah menjalankan set verify off
untuk menyembunyikan pergantian, tetapi mengaktifkannya mungkin berguna untuk melihat apa yang terjadi.
Perhatikan tanda hubung di akhir setiap baris kueri; itu karakter lanjutan
, dan sebagai define
dokumen menyebutkan:
jadi kueri 'baru' yang ditunjukkan oleh set verify on
akan memiliki seluruh kueri tampilan Anda pada satu baris (jika Anda menampilkannya). Mungkin saja dengan kueri yang cukup panjang Anda akan mencapai batas panjang garis tertentu, tetapi mudah-mudahan Anda tidak akan mencapai titik itu (kecuali Anda melakukannya; lihat di bawah).
Anda dapat melakukan hal yang sama di SQL Developer, tetapi kelanjutannya perlu menggunakan dua tanda hubung, jadi:
define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'
kecuali itu tidak sama dengan kelanjutan di SQL*Plus; di sini definisi harus diakhiri dengan tanda hubung, tetapi tidak diganti dengan cara yang dijelaskan oleh dokumen SQL*Plus - jadi dengan satu tanda hubung, definisi berfungsi tetapi kueri berakhir tidak valid. (Setidaknya di 4.2.0; mungkin bug...) Dengan menggunakan dua tanda hubung, definisi multi-baris masih berfungsi, tanda pisah tetap menjadi bagian dari kueri, tetapi mereka diperlakukan sebagai penanda komentar; jadi mereka membuat kueri yang diganti terlihat aneh (sekali lagi, jika Anda menampilkannya) tetapi jangan berhenti berfungsi. Anda tidak akan melihat dengan set verify off
kecuali seseorang melihat v$sql
.
Jika kueri Anda melebihi 240 karakter - yang kemungkinan besar kecuali jika cukup sepele untuk diulang - Anda akan menekan sesuatu seperti:
string beginning "'SELECT * ..." is too long. maximum size is 240 characters.
Baik SQL*Plus dan SQL Developer memungkinkan Anda menyetel variabel substitusi dari kueri, menggunakan kolom column ... new_value
perintah
:
column tempalias new_value tempview_query
set termout off
select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;
set termout on
Kueri memilih teks kueri tampilan Anda sebagai string; Saya telah menggunakan mekanisme kutipan alternatif
, dengan []
sebagai pembatas, jadi Anda tidak perlu keluar dari tanda kutip tunggal dalam kueri tampilan. (Anda harus memilih pembatas yang tidak dapat muncul dalam kueri juga, tentu saja). Perhatikan juga bahwa Anda tidak memerlukan karakter kelanjutan baris lagi.
Literal teks yang dihasilkan kueri disebut sebagai tempalias
. column
perintah menyetel tempview_query
variabel substitusi ke apa pun yang berisi ekspresi kolom alias itu. Menggunakan variabel substitusi kemudian sama seperti pada contoh sebelumnya.
WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
set termout
baris hanya menyembunyikan kueri penghasil itu; Anda dapat menghilangkan sementara off
baris untuk melihat apa yang dihasilkan kueri, dan itu sama persis dengan kueri tampilan yang Anda harapkan.
Klien lain mungkin memiliki mekanisme yang serupa, tetapi hanya dua itu yang sangat saya kenal. Saya mungkin juga harus menegaskan kembali bahwa ini sedikit peretasan, dan bukan sesuatu yang saya rekomendasikan...