将查询结果提取到过程中的游标中

时间:2013-02-05 23:11:44

标签: sql oracle oracle11g

我正在将许多程序从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_PARAMETERPROCEDURE_PARAM相同,也是最重要的,如何将结果提取到游标中? 我陷入了这个问题。任何帮助,将不胜感激。通过这个例子,我可以开始转换我所有的程序。

最好的问候。

1 个答案:

答案 0 :(得分: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;

这样我就不必向上滚动光标def来查看它实际上在做什么。