sql >> Database >  >> RDS >> Oracle

Definieer een VIEW in Oracle zonder CREATE . te gebruiken

Het verkrijgen van de juiste machtigingen en het maken van permanente objecten is de beste aanpak. Het klinkt alsof deze weergave alleen in een enkel script zou worden gebruikt, wat het niet noodzakelijkerwijs minder geldig maakt om het te maken, maar het kan zijn dat het moeilijker te rechtvaardigen is, afhankelijk van uw DBA en beleid. Het is zeker de moeite waard om die aanpak te proberen, zoals @DCookie suggereerde.

Als dat niet lukt, kunnen er hacky-oplossingen zijn, afhankelijk van de client waarin u dit script uitvoert.

In SQL*Plus is het bijvoorbeeld mogelijk misbruik maken van substitutievariabelen om iets te krijgen dat in de buurt komt van wat je beschrijft. Dit gebruikt de define commando om een ​​vervangingsvariabele te maken die de 'view'-query bevat, en die variabele vervolgens te gebruiken in een WITH clausule. (Je kunt de hele with zoals dit, maar misschien is het zo duidelijker). Ik heb een triviale dummy-query gebruikt:

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;

Wanneer het script wordt uitgevoerd, is de geproduceerde uitvoer:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

Ik heb ook set verify off uitgevoerd om de vervangingen te verbergen, maar inschakelen kan leerzaam zijn om te zien wat er gebeurt.

Let op de streepjes aan het einde van elke regel van de query; dat is het vervolgteken , en zoals de define documenten vermelden:

dus de 'nieuwe' zoekopdracht die wordt weergegeven door set verify on zal uw volledige weergavequery op een enkele regel hebben (als u deze weergeeft). Het is mogelijk dat u met een zoekopdracht die lang genoeg is, een limiet voor de regellengte bereikt, maar hopelijk bereikt u dat punt niet (behalve dat u dat deed; zie hieronder).

U kunt hetzelfde doen in SQL Developer, maar daar moet het vervolg twee streepjes gebruiken, dus:

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

behalve dat het niet helemaal hetzelfde is als het vervolg in SQL*Plus; hier moet de definitie eindigen met een streepje, maar het wordt niet vervangen zoals de SQL * Plus-documenten beschrijven - dus met een enkel streepje werkt de definitie, maar de query wordt ongeldig. (Tenminste in 4.2.0; mogelijk een bug...) Door twee streepjes te gebruiken, werkt de meerregelige definitie nog steeds, de streepjes blijven onderdeel van de query, maar worden behandeld als commentaarmarkeringen; dus ze laten de vervangende vraag er vreemd uitzien (nogmaals, als je hem weergeeft), maar ze laten het niet stoppen met werken. Je merkt het niet met set verify off tenzij iemand in v$sql kijkt .

Als uw zoekopdracht langer is dan 240 tekens - wat vrij waarschijnlijk is, tenzij het triviaal genoeg is om het toch te herhalen - krijgt u zoiets als:

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

Met zowel SQL*Plus als SQL Developer kunt u een vervangingsvariabele instellen vanuit een query, met behulp van de column ... new_value commando :

column tempalias new_value tempview_query
set termout off

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

set termout on

De query selecteert de tekst van uw view-query als een tekenreeks; Ik heb het alternatief aanhalingsmechanisme gebruikt , met [] als scheidingstekens, zodat u geen enkele aanhalingstekens hoeft te escapen in de weergavequery. (Je moet natuurlijk een scheidingsteken kiezen dat niet in de query kan verschijnen). Houd er ook rekening mee dat u het vervolgteken voor de regel niet meer nodig heeft.

De letterlijke tekst die de query genereert, wordt gealiast als tempalias . De column commando stelt de tempview_query . in substitutievariabele voor wat die aliased kolomuitdrukking bevat. Het gebruik van de substitutievariabele is dan hetzelfde als in de vorige voorbeelden.

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

De set termout regels verbergen gewoon die genererende query; u kunt tijdelijk de off weglaten regel om te zien wat de zoekopdracht oplevert en of deze exact overeenkomt met de weergave die u verwachtte.

Andere clients kunnen soortgelijke mechanismen hebben, maar dat zijn de enige twee die ik echt ken. Ik moet waarschijnlijk ook herhalen dat dit een beetje een hack is, en niet iets dat ik per se zou aanraden...



  1. Wat is bij het ontwerpen van databases de voorkeursmanier om meerdere waar/onwaar-waarden op te slaan?

  2. Tel rijen totdat de waarde in de kolom verandert mysql

  3. Hoe de batchbewerking uit te voeren met pl/sql

  4. Is er een manier om een ​​gebruiker of een verbinding in PostgreSql te beperken of te beperken?