3

多くの手順を MySQL から oracle に移行していますが、いくつかの問題が見つかりました。これは私がこれまでに得たものです:

CREATE OR REPLACE PROCEDURE PROCEDURE1(PROCEDURE_PARAM IN NUMBER)
IS
CURSOR C1 (CURSOR_PARAMETER IN NUMBER)
IS
 SELECT COL1, COL2, MY_FUNCTION1(P1), SUM(COL3), MY_FUNCTION2(P1,P2)
        COL4, MY_FUNCTION(P1,P2,P3,P4)
 FROM TABLE_1
 WHERE COL1 = CURSOR_PARAMETER -- How to reference it to 'Procedure_param' ?
 GROUP BY COL1, COL2, COL4
 ORDER BY COL2;

BEGIN
    -- HOW TO FETCH RESULTS INTO CURSOR ??
END PROCEDURE1;
/

これらは、名前列と関数 (ユーザー作成関数) の例です。私の懸念は、パラメーターCURSOR_PARAMETERが同じでPROCEDURE_PARAMあり、最も重要であることをカーソルに伝える方法です。結果をカーソルにフェッチする方法は? 私はこの問題で立ち往生しています。どんな助けでも大歓迎です。この例では、必要なすべてのプロシージャの変換を開始できます。

よろしくお願いします。

4

1 に答える 1

2

次のようにカーソルからフェッチします。

BEGIN
  for r_row in C1(PROCEDURE_PARAM)
  loop
    dbms_output.put_line(r_row.col1);--or whatever you want to do here.
  end loop;
end;

私は通常、これらをインラインで次のように書くことを好みますが

begin
  for r_row in (SELECT COL1, COL2, MY_FUNCTION1(P1), 
                       SUM(COL3), MY_FUNCTION2(P1,P2)
                       COL4, MY_FUNCTION(P1,P2,P3,P4)
                  FROM TABLE_1
                 WHERE COL1 = PROCEDURE_PARAM 
                 GROUP BY COL1, COL2, COL4
                 ORDER BY COL2)
  loop
    ...
  end loop;

カーソル定義までスクロールして、実際に何をしていたかを確認する必要がないようにします。

于 2013-02-06T00:04:06.947 に答える