0

プラットフォーム:Oracle
言語:PL / SQL
問題:プロシージャOUTカーソルをSQLDeveloperSQLWosksheetに出力したい。

Oracleの「Select*from Table(PipelinedFunction(Param))」を使用してプロシージャコードの出力カーソルを確認する方法を知っている人はいますか?

OracleストアドプロシージャからCrsytalReportsを使用しています。Crystalでは、プロシージャがカーソルを返す必要があり、カーソルをフェッチして読み取ります。

私が持っているプロシージャコードは現在機能していますが、プロシージャコードへの変更の影響を表示する最も簡単な方法を見つけたいと思います。SQLDeveloperを利用でき、その中で作成とSQLテストを行っています。SQL Developerのクエリ結果ウィンドウ(「SQLワークシート」)にすばやく結果を表示したいと思います。

関数を使用してプロシージャからカーソルを読み取る(簡単な)方法はありますか?(そしてそれをTable関数にパイプしますか?)

複雑なことはわかっていますが、コード変更の結果を確認できる場合に最もうまく対処します。記録結果を直接見ることができれば、報告書の作成がスピードアップします。

Table関数と、Oracleでのパイプライン化について少し知っています。一般的なカーソルとsys_refcursorについて少し知っています。私はタイプについて、そしてなぜそれらが必要なのかをよく知っています。(sys_regCursorは私たちをそれから遠ざけることになっているのではありませんか?)

現在のプロシージャは、適切ではあるが適切ではない一連のクエリを実行し、グローバル一時テーブル(GTT)に挿入し、GTTと元のテーブルから結合し、挿入を増やし、自己結合を増やしてから、結果をOUTカーソルに選択します。カーソルなどだけに頼るほうがいいかもしれませんが、現在の方法でレポートに結果を出すことができます。

私は(私たちの目的のために)SQLをかなりうまく処理できると思いますが、私はOracle固有の開発者ではありません...しかし、助けが必要です。

誰かがこれに出くわしますか?全体的なアイデアは、プロシージャコードの開発をスピードアップすることでしたが、出力を取得する方法を探すために2、3日を費やしました...私が考えていたものではありません。

更新:
私はウェブ上で見たスライバーに基づいたいくつかの頭の悪いスキームを試しました...など

Create or replace FUNCTION GET_BACKPLANE (
   Node VARCHAR2 ) RETURN SYS_REFCURSOR
AS

RESULTS SYS_REFCURSOR;

BEGIN
    Open Results for
        Select Backplane(Results, Node) from Dual ;
    ... etc.

Create or replace Function GET_BACKPLANE ( 
    NODE VARCHAR2 )  RETURN  My_Table_Stru%ROWTYPE  PIPELINED
AS

BEGIN ...

Oracleは、プロシージャからの出力カーソルを再参照することを検討しているとは思いません( "Results"は、プロシージャの最後のSELECTの結果を保持するsys_refcursorです)。それを定義し、開いて、手順から参照する方法がわかりません。

試すことができる場所にたどり着きませんでした

SELECT * FROM TABLE(GET_BACKPLANE( ... etc )

タイプミスやOracleGrammarの不良については申し訳ありませんが、数日が経ちました。

4

2 に答える 2

3

SQL Developerを使用すると、ワークシートでSQL*Plusコマンドを使用できます。したがって、必要なのは、参照カーソルの出力を保持する変数を定義することだけです。

実行したい実際のコードを誤って解釈した可能性がありますが、実際のプログラムは、データ型sys_refcursorのOUTパラメーターであり、入力パラメーターであるプロシージャBackplane(Results, Node)であると想定しています。 resultsnode

var rc refcursor

exec  Backplane(results=>:rc, Node=>42) 

print rc

printステートメントの出力は、 [スクリプト出力]ペインに書き込まれます。

F5SQL * Plusコマンドを使用するということは、executeステートメントではなくRunScriptオプションを使用する必要があることに注意してください。

于 2010-10-07T05:27:20.970 に答える
0

助けてくれてありがとう。最終的に、ブルートフォース攻撃を終了しました...ステップバイステップ:クエリを作成し、クエリをテストし、構造からグローバル一時テーブルを作成し、そのGTTから別のクエリを作成するコードを追加し、テストします。クエリ、構造からグローバル一時テーブルの作成など。

結局、(匿名ブロックの)スクリプトを実行し、すべての段階でGTTの内容を確認することになりました。

最後の部分は、元の手順と同じ最後のクエリを使用して、クリスタルが好きなカーソルにすべてを詰め込むことでした...

明日、私はそれをテストします。

しかし、私は次の手順のためにそれを強制的に実行し、2週間以上ではなく1日半で完了します(恥ずかしい)。

ありがとう、

マーク

于 2010-10-08T02:14:45.293 に答える