正しい権限を取得して永続的なオブジェクトを作成することが最善のアプローチです。このビューは単一のスクリプトでのみ使用されるように思われるため、必ずしも作成の有効性が低下するわけではありませんが、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
で示される「新しい」クエリ ビュークエリ全体が1行に表示されます(表示する場合)。十分な長さのクエリを使用すると、行の長さの制限に達する可能性がありますが、そのポイントに到達しないことを願っています(ただし、到達した場合を除きます。以下を参照してください)。
SQL Developerでも同じことができますが、継続には2つのダッシュを使用する必要があるため、次のようになります。
define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'
ただし、SQL*Plusの継続とはまったく同じではありません。ここでは、定義はダッシュで終了する必要がありますが、SQL * Plusのドキュメントで説明されている方法では置き換えられません。したがって、1つのダッシュで定義は機能しますが、クエリは無効になります。 (少なくとも4.2.0では、バグの可能性があります...)2つのダッシュを使用しても、複数行の定義は機能します。ダッシュはクエリの一部のままですが、コメントマーカーとして扱われます。そのため、置換されたクエリは奇妙に見えますが(これも表示すると)、動作を停止しません。 set verify off
では気付かないでしょう 誰かがv$sql
を調べない限り 。
クエリが240文字を超える場合(とにかく繰り返すのに十分な些細なことでない限り、可能性が高いです)、次のようになります。
string beginning "'SELECT * ..." is too long. maximum size is 240 characters.
SQL *PlusとSQLDeveloperはどちらも、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
を一時的に省略できます 行を表示して、クエリが生成するものと、期待したビュークエリと完全に一致することを確認します。
他のクライアントも同様のメカニズムを持っているかもしれませんが、私が本当によく知っているのはそれらだけです。これはちょっとしたハックであり、必ずしもお勧めするものではないことも繰り返し述べておきます...