sql >> Databáze >  >> RDS >> Oracle

Definujte VIEW v Oracle bez použití CREATE

Získání správných oprávnění a vytvoření trvalých objektů je nejlepší přístup. Zdá se, že tento pohled by byl použit pouze v jediném skriptu, což nutně neznamená, že jeho vytvoření bude méně platné, ale v závislosti na vašem DBA a zásadách může být pro vás obtížnější odůvodnit. Určitě stojí za to vyzkoušet tento přístup, jak navrhl @DCookie.

Pokud to selže, mohou existovat hackeřiná řešení v závislosti na klientovi, ve kterém budete tento skript spouštět.

Například v SQL*Plus je to možné ke zneužití substitučních proměnných dostat se k tomu, co popisujete. Toto používá define příkaz k vytvoření substituční proměnné, která obsahuje dotaz 'view', a pak tuto proměnnou použije uvnitř WITH doložka. (Nelze nahradit celý with takhle, ale stejně je to možná jasnější). Použil jsem triviální fiktivní dotaz:

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;

Když je skript spuštěn, vytvořený výstup je:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

Také jsem provedl set verify off skrýt substituce, ale jeho zapnutí může být poučné, abyste viděli, co se děje.

Všimněte si pomlček na konci každého řádku dotazu; to je znak pokračování a jako define dokumenty zmiňují:

takže „nový“ dotaz zobrazený pomocí set verify on bude mít celý váš dotaz na zobrazení na jednom řádku (pokud jej zobrazíte). Je možné, že s dostatečně dlouhým dotazem narazíte na nějaký limit délky řádku, ale doufejme, že tohoto bodu nedosáhnete (kromě vás, viz níže).

Totéž můžete udělat v SQL Developer, ale tam musí pokračování používat dvě pomlčky, takže:

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

až na to, že to není úplně stejné jako pokračování v SQL*Plus; zde definice musí končit pomlčkou, ale nenahrazuje se tak, jak popisují dokumenty SQL*Plus - takže s jednou pomlčkou definice funguje, ale dotaz skončí neplatným. (Alespoň ve 4.2.0; možná chyba...) Při použití dvou pomlček víceřádková definice stále funguje, pomlčky zůstávají součástí dotazu, ale jsou považovány za značky komentářů; takže nahrazovaný dotaz vypadá divně (opět, když ho zobrazíte), ale nepřestanou to fungovat. Když set verify off, toho si nevšimnete pokud se někdo nepodívá do v$sql .

Pokud váš dotaz přesáhne 240 znaků – což je spíše pravděpodobné, pokud to není dostatečně triviální na opakování – narazíte na něco jako:

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

SQL*Plus i SQL Developer umožňují nastavit substituční proměnnou z dotazu pomocí sloupec column ... new_value příkaz :

column tempalias new_value tempview_query
set termout off

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

set termout on

Dotaz vybere text dotazu zobrazení jako řetězec; Použil jsem alternativní mechanismus citování , s [] jako oddělovače, takže v dotazu zobrazení nemusíte uvozovat žádné jednoduché uvozovky. (Musíte vybrat oddělovač, který se samozřejmě také nemůže objevit v dotazu). Všimněte si také, že již nepotřebujete znak pro pokračování řádku.

Textový literál, který dotaz generuje, má alias jako tempalias . column příkaz nastaví tempview_query substituční proměnná za cokoliv, co tento aliasový sloupcový výraz obsahuje. Použití substituční proměnné je pak stejné jako v předchozích příkladech.

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

set termout řádky jen skryjí ten generující dotaz; můžete dočasně vynechat off řádek, abyste viděli, co dotaz produkuje a zda přesně odpovídá dotazu zobrazení, který jste očekávali.

Ostatní klienti mohou mít podobné mechanismy, ale to jsou jediné dva, které znám. Pravděpodobně bych měl také zopakovat, že je to trochu hack a ne něco, co bych nutně doporučil...



  1. MySQL Počítání různých hodnot z jednoho sloupce

  2. PŘIDAT SLOUPEK MySQL

  3. Vnitřní spojení SQLite

  4. V jakém pořadí jsou MySQL JOINy ​​vyhodnocovány?