1

非常に一般的なタイトルで申し訳ありませんが、短い言葉でそれを置くための最良の方法を考えることはできません。さまざまな顧客向けのいくつかのエクスポートについて問い合わせがあります。これらは各顧客に対して同じクエリですが、IDによってフィルタリングされます。さまざまな種類のエクスポートごとにタブを作成し、各タブにさまざまな顧客の変数を設定して、任意の顧客の任意のDBインスタンスで簡単に実行できるようにしたかったのです。ただし、最後のステートメントはクエリであり、結果ウィンドウに返すようにしたいのですが、INTOステートメントを期待していることを示しています。私はカーソルが苦手です。それが正しい答えかどうかはわかりませんが、過去に皆さんが私をかなり助けてくれたので、皆さんに聞いてみようと思いました。ありがとう。

タブの例:

DECLARE  lEventID    INTEGER;
         lCustID     INTEGER := 1 -- Development Customer1
         --lCustID     INTEGER := 2 -- Development Customer2
         --lCustID     INTEGER := 3 -- Development Customer3
         --lCustID     INTEGER := 4 -- Development Customer4
         --lCustID     INTEGER := 5 -- Development Customer5
         --lCustID     INTEGER := 101 -- Testing Customer1
         --lCustID     INTEGER := 102 -- Testing Customer2
         --lCustID     INTEGER := 103 -- Testing Customer3
         --lCustID     INTEGER := 104 -- Testing Customer4
         --lCustID     INTEGER := 105 -- Testing Customer5
         --lCustID     INTEGER := 201 -- Production Customer1
         --lCustID     INTEGER := 202 -- Production Customer2
         --lCustID     INTEGER := 203 -- Production Customer3
         --lCustID     INTEGER := 204 -- Production Customer4
         --lCustID     INTEGER := 205 -- Production Customer5

BEGIN

    SELECT  EventID INTO lEventID
    FROM    Event
    WHERE   EventName = 'Event1'

    SELECT  Field1,
            Field2,
            Field3
    FROM    Table1
    WHERE   EventID = lEventID
      AND   CustomerID = lCustID;

END;

今、私はおそらくに変更DECLAREvar、削除しBEGINEND;、次に、最初のクエリを2番目のクエリのサブクエリとして配置すると、機能するはずです。ただし、これをパッケージ内と同じように構造化しようとしています。更新ステートメントと挿入ステートメントがあるため、このコードがパッケージ内にあるプロシージャを実行したくありません。このクエリを実行したいのは、実際に実行する前に何が起こるかを確認できるようにするためです。このワークスペースを仲間の従業員と共有するつもりです。彼らが混乱しすぎないようにしたいと思います。元のパッケージでは、クエリはカーソルに置かれます。カーソルは、最終的にエクスポートされるプロシージャのoutパラメータです。よろしくお願いします。また、Benthic Goldenは、開発者がOracleと対話するために使用するユーティリティです。これは、当社がライセンスを持っているためです(他のスイートは使用できません)。

4

2 に答える 2

1

2番目のSELECTステートメントで「INTO」を指定しなかったので、いつでも次のようなものを使用できます。

CURSOR mySqlStatement IS
SELECT  Field1,
            Field2,
            Field3
    FROM    Table1
    WHERE   EventID = lEventID
      AND   CustomerID = lCustID;

(DECLAREエリアへ)

SELECT ABC INTOの代わりに(BEGINの後)

FOR row_ IN mySqlStatement LOOP
//row_ gets generated automaticly and you can access colums as row_.columname
END LOOP;
于 2012-08-24T13:06:02.463 に答える
1

PL / SQLブロック内で、何かを選択する必要があります。ローカル変数(Najzeroが示したように印刷できます)に明示的に入れるか、後で操作または印刷するためにローカルで宣言されたカーソル、または外部で宣言された(ref)カーソルに入れます。

あなたのコメントに基づくと、このクライアントでの経験ではなく、これを行うことができるはずです:

var reccursor refcursor;

DECLARE
    lEventID    INTEGER;
    lCustID     INTEGER := 1;
BEGIN

    SELECT  EventID INTO lEventID
    FROM    Event
    WHERE   EventName = 'Event1'

    -- open an externally-declared ref cursor to hold the result of the query
    OPEN :reccursor FOR
        SELECT  Field1,
                Field2,
                Field3
        FROM    Table1
        WHERE   EventID = lEventID
          AND   CustomerID = lCustID;
END;
/

out私が想像することは、バインド変数ではなくパラメータrefカーソルを開くことを除いて、プロシージャが行うことと非常に似ています。

これは、SQL *PlusまたはSQLDeveloperで行う場合と同じですが、print :reccursorその内容を表示するには明示的なものが必要ですが、クライアントが自動的に処理するように見えます。

于 2012-08-24T16:56:51.263 に答える