Oracle
 sql >> база данни >  >> RDS >> Oracle

Дефинирайте VIEW в Oracle, без да използвате CREATE

Получаването на правилните разрешения и създаването на постоянни обекти е най-добрият подход. Изглежда, че този изглед ще се използва само в един скрипт, което не прави непременно по-малко валидно създаването му, но може да го намерите по-трудно за оправдаване в зависимост от вашия 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 ред, за да видите какво произвежда заявката и че тя съвпада точно със заявката за преглед, която очаквате.

Други клиенти може да имат подобни механизми, но това са единствените два, с които наистина съм запознат. Вероятно трябва да повторя, че това е малко хак, а не нещо, което непременно бих препоръчал...



  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 - Материализираният изглед променя структурата толкова бавно

  2. ora_hash детерминистичен ли е?

  3. Как да използвам базиран на функция индекс в колона, която съдържа NULL в Oracle 10+?

  4. ORACLE Прехвърля ДАТА към TIMESTAMP С ЧАСОВА ЗОНА С ОТСТЪПКА

  5. Как да реализираме многоизмерни последователности