在Oracle中,为打开和使用参数打开光标有什么区别?

在Oracle中,为打开和使用参数打开光标有什么区别?,oracle,plsql,Oracle,Plsql,这两段代码之间有什么区别 TYPE t_my_cursor IS REF CURSOR; v_my_cursor t_my_cursor; OPEN v_my_cursor FOR SELECT SomeTableID FROM MYSCHEMA.SOMETABLE WHERE SomeTableField = p_parameter; 而且 CURSOR v_my_cur(p_parameter VARCHAR2) IS SELECT SomeTable

这两段代码之间有什么区别

TYPE t_my_cursor IS REF CURSOR; 
v_my_cursor t_my_cursor;
OPEN v_my_cursor FOR SELECT  SomeTableID 
        FROM MYSCHEMA.SOMETABLE
        WHERE SomeTableField = p_parameter;
而且

CURSOR v_my_cur(p_parameter VARCHAR2) IS
SELECT SomeTableID
FROM MYSCHEMA.SOMETABLE
WHERE SomeTableField = p_parameter;

OPEN presf_cur(p_subscriber_id);
他们两个似乎都工作。它们是相同的还是有一些我应该注意的差异

  • 强类型游标可以“描述”
  • 如果你的建筑 API(一个包)您可以将 光标定义位于 规范级别,并给出 客户端程序员更好地理解 API的作用和返回 不需要意识到 源代码
  • 布局/IDE/GUI工具 可能会和一个有名字的人玩得更好 光标
  • 使用已知类型的游标可能会带来微不足道的性能优势;但我不认为这有什么意义

  • 第二个示例是显式游标,它是静态的。也就是说,它是一个与一条SQL语句关联的变量。有一个隐含的等价物

    FOR lrec in ( SELECT  SomeTableID 
                  FROM MYSCHEMA.SOMETABLE
                  WHERE SomeTableField = p_parameter )
    LOOP
        do_something_with (lrec.sometableid);
    END LOOP;
    
    第一个示例是ref游标,它是指向SQL语句的指针,因此可以是动态的。例如,我们可以这样扩展该示例:

    TYPE t_my_cursor IS REF CURSOR; 
    v_my_cursor t_my_cursor;
    
    ...
    
    if flag = 1 then
        OPEN v_my_cursor FOR SELECT  SomeTableID 
            FROM MYSCHEMA.SOMETABLE
            WHERE SomeTableField = p_parameter;
    else
        OPEN v_my_cursor FOR SELECT  SomeTableID 
            FROM MYSCHEMA.ANOTHERTABLE
            WHERE AnotherTableField = p_parameter;
    end if;
    
    甚至:

        l_stmt := 'SELECT * FROM your_table WHERE ';
        if p_parameter is not null then
            l_stmt := l_stmt ||'id = :1'; 
            open v_my_cursor for l_stmt using p_parameter;
        else
            l_stmt := l_stmt ||'created_date > trunc(sysdate)'; 
            open v_my_cursor for l_stmt;
        end if;
    
    因此,使用ref游标可以让我们更好地控制最终执行的SQL语句。另一个区别是,因为ref游标是指针,所以它可以在程序之间传递。这对于将数据从PL/SQL传递到其他语言(例如JDBC结果集)非常有用