Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Tentukan VIEW di Oracle tanpa menggunakan CREATE

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...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle - Penggunaan indeks dengan parameter opsional

  2. Bagaimana cara menghubungkan ke Oracle DB dari .NET?

  3. Bagaimana cara mengubah ukuran kolom tampilan di Oracle

  4. Oracle SQL - Bagaimana cara mendapatkan jumlah yang berbeda untuk setiap kolom secara dinamis?

  5. Cara Memesan Berdasarkan Tanggal di PostgreSQL atau Oracle