Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zdefiniuj WIDOK w Oracle bez użycia CREATE

Najlepszym podejściem jest uzyskanie odpowiednich uprawnień i tworzenie trwałych obiektów. Wygląda na to, że ten widok byłby używany tylko w jednym skrypcie, co niekoniecznie oznacza, że ​​tworzenie go jest mniej ważne, ale może być trudniej je uzasadnić w zależności od Twojego DBA i zasad. Z pewnością warto wypróbować takie podejście, jak sugeruje @DCookie.

Jeśli to się nie powiedzie, mogą istnieć hakerskie obejścia, w zależności od klienta, na którym uruchomisz ten skrypt.

Na przykład w SQL*Plus jest to możliwe nadużyć zmiennych podstawienia aby uzyskać coś zbliżonego do tego, co opisujesz. Używa define polecenie aby utworzyć zmienną podstawienia, która zawiera zapytanie 'view', a następnie używa tej zmiennej wewnątrz WITH klauzula. (Nie możesz zastąpić całego with tak, ale może i tak jest jaśniej). Używam trywialnego fikcyjnego zapytania:

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;

Po uruchomieniu skryptu dane wyjściowe są następujące:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

Wykonałem również set verify off aby ukryć zamiany, ale włączenie go może być pouczające, aby zobaczyć, co się dzieje.

Zwróć uwagę na myślniki na końcu każdej linii zapytania; to jest znak kontynuacji i jako define dokumenty wspominają:

więc 'nowe' zapytanie pokazane przez set verify on będzie mieć całe zapytanie widoku w jednym wierszu (jeśli je wyświetlisz). Możliwe, że przy wystarczająco długim zapytaniu osiągniesz pewien limit długości linii, ale miejmy nadzieję, że nie osiągniesz tego punktu (z wyjątkiem tego, że tak się stało; patrz poniżej).

Możesz zrobić to samo w SQL Developer, ale tam kontynuacja wymaga użycia dwóch myślników, więc:

define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'

z wyjątkiem tego, że nie jest to dokładnie to samo, co kontynuacja w SQL*Plus; tutaj definicja musi kończyć się myślnikiem, ale nie jest zastępowana w sposób opisany w dokumentacji SQL*Plus - tak więc z pojedynczym myślnikiem definicja działa, ale zapytanie kończy się niepoprawne. (Przynajmniej w 4.2.0; prawdopodobnie błąd...) Używając dwóch myślników, wielowierszowa definicja nadal działa, myślniki pozostają częścią zapytania, ale są traktowane jako znaczniki komentarza; więc sprawiają, że podstawione zapytanie wygląda dziwnie (znowu, jeśli je wyświetlisz), ale nie przerywaj jego działania. Nie zauważysz, gdy set verify off chyba że ktoś szuka w v$sql .

Jeśli Twoje zapytanie przekracza 240 znaków – co jest dość prawdopodobne, chyba że i tak jest na tyle trywialne, by je powtórzyć – trafisz coś takiego:

string beginning "'SELECT * ..." is too long. maximum size is 240 characters.

Zarówno SQL*Plus, jak i SQL Developer umożliwiają ustawienie zmiennej podstawienia z zapytania przy użyciu column ... new_value polecenie :

column tempalias new_value tempview_query
set termout off

select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;

set termout on

Zapytanie wybiera tekst zapytania widoku jako ciąg; Użyłem alternatywnego mechanizmu cytowania , z [] jako ograniczniki, dzięki czemu nie trzeba wprowadzać żadnych pojedynczych cudzysłowów w zapytaniu widokowym. (Musisz oczywiście wybrać ogranicznik, który nie może się również pojawić w zapytaniu). Pamiętaj też, że nie potrzebujesz już znaku kontynuacji linii.

Literał tekstowy generowany przez zapytanie ma alias tempalias . column polecenie ustawia tempview_query podstawianie zmiennej do tego, co zawiera to wyrażenie kolumny z aliasem. Użycie zmiennej zastępczej jest wtedy takie samo, jak w poprzednich przykładach.

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

set termout wiersze po prostu ukrywają to generujące zapytanie; możesz tymczasowo pominąć off linii, aby zobaczyć, co generuje zapytanie i czy dokładnie odpowiada oczekiwanemu zapytaniu widoku.

Inni klienci mogą mieć podobne mechanizmy, ale to jedyne dwa, które naprawdę znam. Powinienem prawdopodobnie powtórzyć, że jest to trochę hack, a nie coś, co koniecznie poleciłbym...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić tymczasową instancję CLOB z funkcji przechowywanej w Pl/SQL?

  2. Przypisanie kursora funkcji

  3. Jak skonfigurować katalog docelowy dziennika archiwum w bazie danych Oracle

  4. Autoinkrementacja w Oracle z sekwencją i wyzwalaczem - nieprawidłowa instrukcja sql

  5. Alternatywy PostgreSQL i/lub SQL Server dla SYS_CONTEXT firmy Oracle