2013-02-05 24 views
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_PARAMETERPROCEDURE_PARAM相同,也是最重要的,如何将结果提取到游标中? 我被困在这个问题中。任何帮助,将不胜感激。通过这个例子,我可以开始转换我必须的所有程序。

此致敬礼。

回答

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; 

,这样我就不必了高清滚动游标看看它实际上在做什么。

+0

感谢您的回答。还有一个问题。我如何“返回”(我知道这是一个过程而不是函数)所提取的游标。循环语句和循环语句之间应该做什么? –

+0

@AlejandroBastidas'CURSOR'不可退货,它们只能在打开的程序单元内使用。要返回一个结果集,你必须使用一个引用游标。请参阅:http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php然后,您可以将其作为过程中的OUT参数返回或作为函数返回 – DazzaL

+0

你非常。 –

相关问题