カーソル上でいくつかのコードを実行したいが、カーソルの内容を報告して、プレビューはExcelのクエリテーブルで、{Call}
構文の場合はREF CURSOR
が必要です。 PL/SQLでは、コーディングのための自然な構文は明示的なカーソルです。 this questionの@XINGの助けを借りて、私はこのパッケージを開発しました。私のスニークプレビュー用列の名前を変更せずに明示的カーソルを参照カーソルに変換するATTR_n
CREATE OR REPLACE PACKAGE MyPackage
AS
-- This could be a complex query with many paramters and columns
CURSOR curMyCursor(pParam1 VARCHAR2) IS
SELECT pParam1 hello, 'ColNames' goodbye
FROM DUAL;
-- I could just let GiveMyCursor return a SYS_REFCURSOR but wanted to try max clues
TYPE refMyCursor IS REF CURSOR RETURN curMyCursor%ROWTYPE;
-- The TABLE function in GiveMyCursor needs the row type to be externalized
TYPE typMyCursor IS TABLE OF curMyCursor%ROWTYPE;
PROCEDURE RunMyCursor(pParam1 IN VARCHAR2);
PROCEDURE GiveMyCursor(pCursor OUT refMyCursor, pParam1 IN VARCHAR2);
END MyPackage;
/
CREATE OR REPLACE PACKAGE BODY MyPackage
AS
PROCEDURE RunMyCursor(pParam1 IN VARCHAR2) IS
BEGIN
FOR recMyCursor IN curMyCursor(pParam1) LOOP
NULL; -- Do normal cursor loop processing
END LOOP;
END RunMyCursor;
PROCEDURE GiveMyCursor(pCursor OUT refMyCursor, pParam1 IN VARCHAR2) IS
tabMyCursor typMyCursor;
BEGIN
OPEN curMyCursor(pParam1);
-- Load the entire contents of the cursor into memory and pray it fits
FETCH curMyCursor BULK COLLECT INTO tabMyCursor;
CLOSE curMyCursor;
-- PROBLEM: The TABLE function renames the columns ATTR_1, ATTR_2, etc
OPEN pCursor FOR
SELECT ATTR_1 HELLO, ATTR_2 GOODBYE
FROM TABLE(tabMyCursor);
END GiveMyCursor;
END MyPackage;
/
私は、彼らがリフレッシュすることができソートをフィルタリングして、エンドユーザーに単純なテーブルを与えたいです。クエリを複製せずに、REF CURSOR
を返すプロシージャを持つ単純なExcelクエリテーブル。 {call MyPackage.GiveMyCursor('World')}
が与える:
HELLO | GOODBYE
------+---------
World | ColNames
私は
を持っているでしょうOPEN pCursor
の列名を再指定していなかった場合は
ATTR_1| ATTR_2
------+---------
World | ColNames
のでOPEN pCursor FOR SELECT *
は私が/強化なしその他の保守と私のクエリを修正する許可されているだろうエンドユーザーは列の説明を失うことになります。
GiveMyCursorには何らかの方法がありますが、すべての列名を再指定しないようにするコードを追加できます。一部のビルトインDBMSパッケージは、カーソルやタイプの1つをインターラゲーションして文字列などを作成して汎用的に保つことができます。
私のデータベースはOracle 12.1.0.1 SEです。
あなたが(例えば、[ここ]([DBMS_SQL.TO_CURSOR_NUMBER(https://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS68279)を使用して、REFカーソルの列を解析することができhttp://www.williamrobertson.net/documents/refcursor-to-csv.shtml))。しかし、私があなたの要件を誤解していない限り、問題はあなたが宣言したコレクションタイプの属性を知っているが、メンテナンスを簡素化するためにそれらを再度ハードコーディングすることはない。 'select * from table(tabMyCursor)'を解析するのに 'dbms_sql.to_cursor_number'を使うことができますが、実際にはカラム名が必要ですか? –
@WilliamRobertson私は、なぜカラム名が必要なのか疑問に思うかもしれません。 'dbms_sql.to_cursor_number'は渡された' OPEN'ed 'REF CURSOR'を必要としますが、' SELECT * 'を持つコードがそのポイントに達すると、カラム名は失われています。 – Unoembre