代码之家  ›  专栏  ›  技术社区  ›  dtc

在oracle中,打开for和打开带有参数的游标有什么区别?

  •  6
  • dtc  · 技术社区  · 14 年前

    这两段代码有什么区别?

    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);
    

    他们两个似乎都管用。它们是相同的还是有一些不同我应该知道?

    2 回复  |  直到 14 年前
        1
  •  6
  •   APC    14 年前

    第二个例子是显式游标,它是静态的。也就是说,它是与一个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结果集)非常有用。

        2
  •  5
  •   Brian    14 年前
    1. 可以“描述”强类型游标。
    2. 如果你的建筑 api(一个包)您可以将 光标定义位于 规范级别并给出 客户机程序员 你的api做什么和返回什么 不需要知道 源代码。
    3. 布局/ide/gui工具 可能会和一个 光标。
    4. 拥有一个已知类型的游标可能有微不足道的性能优势;但我不指望它有什么重要的意义。