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

pl/sqlブロックからデータ行を返します

    匿名ブロックは何も返すことができません。ブロック内で、コレクションタイプや参照カーソルなどのバインド変数に値を割り当てることができます。ただし、コレクションは、ブロックの外部で定義および宣言する必要があります。つまり、PL / SQLで定義されているものではなく、プレーンSQLで使用できるタイプである必要があります。現時点では、ブロック内で定義されているPL / SQL型と、ブロック内で宣言されている変数も使用しているため、クライアントのスコープ外であり、外部でも有効な型ではありません。 。 (初期化する必要もありませんが、それは小さな問題です)。

    実際にどのように消費されるかに応じて、1つのオプションは参照カーソルを使用することです。これは、SQL*PlusまたはSQLDeveloperを使用してvariableを使用して宣言および表示できます。 およびprint コマンド。例:

    variable rc sys_refcursor
    
    begin
      open :rc for ( select ... /* your cursor statement */ );
    end;
    /
    
    print rc
    

    クライアントアプリケーションから同様のことを行うことができます。参照カーソルまたは参照カーソルであるoutパラメータを持つプロシージャを返す関数があり、それをアプリケーションからバインドします。次に、結果セットとしてrefカーソルを繰り返し処理します。ただし、詳細はアプリケーションが使用している言語によって異なります。

    もう1つのオプションは、テーブルタイプを返すパイプライン関数を使用することです。これもSQLレベルで定義されています(create typeを使用)。 )PL/SQLにはありません-一度に返されるコレクションよりも少ないリソースを消費する可能性があります。

    しかし、なぜあなたがこれをしているのか疑問に思う必要があります。 「後のバッチを掘り下げるにはかなり時間がかかる」とおっしゃいましたが、これはクエリでページングメカニズムを使用し、行番号を生成してから、その中の100の範囲を選択しているようです。クライアント/アプリケーションがすべての行を取得したい場合は、単一のクエリを実行する方が簡単ですが、フェッチ 結果セットをバッチで。

    残念ながら、アプリケーションに関する情報がなければ、これは単なる憶測です...



    1. ダンプせずにpostgresqlの列の位置を変更する方法

    2. INSERTINTOテーブルIFテーブルが存在する場合はCREATETABLE

    3. グループ化せずにSUMを作成する方法

    4. SQL * Plusで、接続されているユーザーとデータベースを表示するようにプロンプ​​トを変更するにはどうすればよいですか?