Получаването на правилните разрешения и създаването на постоянни обекти е най-добрият подход. Изглежда, че този изглед ще се използва само в един скрипт, което не прави непременно по-малко валидно създаването му, но може да го намерите по-трудно за оправдаване в зависимост от вашия DBA и политики. Със сигурност си струва да опитате този подход, както предложи @DCookie.
Ако това не успее, може да има хакерски решения, в зависимост от клиента, в който ще стартирате този скрипт.
Например в SQL*Plus е възможно за злоупотреба с променливи за заместване
за да получите нещо близко до това, което описвате. Това използва define
команда
за създаване на заместваща променлива, която съдържа заявката 'view' и след това използва тази променлива в WITH
клауза. (Не можете да замените целия with
така, но така или иначе може би е по-ясно). Използвам тривиална фиктивна заявка:
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;
Когато скриптът се изпълнява, произведеният резултат е:
D
-
X
X
2 rows selected.
D
-
X
X
2 rows selected.
Също така изпълних set verify off
за да скриете заместванията, но включването му може да е поучително, за да видите какво се случва.
Обърнете внимание на тиретата в края на всеки ред от заявката; това е знак за продължение
и като define
документи споменават:
така че 'новата' заявка, показана от set verify on
ще има цялата ви заявка за преглед на един ред (ако го покажете). Възможно е с достатъчно дълга заявка да достигнете някакво ограничение за дължина на реда, но се надяваме, че няма да достигнете тази точка (освен че не сте го направили; вижте по-долу).
Можете да направите същото в SQL Developer, но там продължението трябва да използва две тирета, така че:
define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'
освен че не е съвсем същото като продължението в SQL*Plus; тук дефинирането трябва да завършва с тире, но не се заменя по начина, по който документите на SQL*Plus описват - така че с едно тире дефинирането работи, но заявката завършва невалидна. (Поне в 4.2.0; вероятно грешка...) Чрез използването на две тирета многоредовата дефиниция все още работи, тиретата остават част от заявката, но се третират като маркери за коментари; така че те правят заместената заявка да изглежда странна (отново, ако я покажете), но не я спирайте да работи. Няма да забележите с set verify off
освен ако някой не погледне в v$sql
.
Ако вашата заявка надвишава 240 знака - което е доста вероятно, освен ако все пак не е достатъчно тривиално, за да се повтори - ще постигнете нещо като:
string beginning "'SELECT * ..." is too long. maximum size is 240 characters.
Както SQL*Plus, така и SQL Developer ви позволяват да зададете заместваща променлива от заявка, като използвате column ... new_value
команда
:
column tempalias new_value tempview_query
set termout off
select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;
set termout on
Заявката избира текста на вашата заявка за изглед като низ; Използвах алтернативен механизъм за цитиране
, с []
като разделители, така че не е нужно да избягвате единични кавички в заявката за изглед. (Трябва да изберете разделител, който също не може да се появи в заявката, разбира се). Също така имайте предвид, че вече не се нуждаете от знака за продължение на реда.
Текстовият литерал, който генерира заявката, е псевдоним като tempalias
. column
команда задава tempview_query
заместваща променлива към каквото и да съдържа изразът на колона с псевдоним. Тогава използването на заместващата променлива е същото като в предишните примери.
WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
set termout
линиите просто скриват тази генерираща заявка; можете временно да пропуснете off
ред, за да видите какво произвежда заявката и че тя съвпада точно със заявката за преглед, която очаквате.
Други клиенти може да имат подобни механизми, но това са единствените два, с които наистина съм запознат. Вероятно трябва да повторя, че това е малко хак, а не нещо, което непременно бих препоръчал...