sql >> データベース >  >> RDS >> Oracle

CREATEを使用せずにOracleでVIEWを定義する

    正しい権限を取得して永続的なオブジェクトを作成することが最善のアプローチです。このビューは単一のスクリプトでのみ使用されるように思われるため、必ずしも作成の有効性が低下するわけではありませんが、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を一時的に省略できます 行を表示して、クエリが生成するものと、期待したビュークエリと完全に一致することを確認します。

    他のクライアントも同様のメカニズムを持っているかもしれませんが、私が本当によく知っているのはそれらだけです。これはちょっとしたハックであり、必ずしもお勧めするものではないことも繰り返し述べておきます...



    1. MySQLJavaをテストするDbUnit

    2. 各行のnull以外の列の数

    3. 値が変更された場合にのみデータベースに挿入するにはどうすればよいですか?

    4. 列の合計を取得し、合計のパーセントを計算するために使用します(mySQL)