很久没有接触存储过程了。
遇到如下问题。
发现在declare的时候,直接声明cursor testcursor is select * from t1;
这样是可以的。但是在begin开始后。
需要再写一个cursor,这个cursor需要前面某处理取得的某个变量作参数。
cursor testcursor2 is select * from t1 where id = 变量1
但是这样写的时候,怎么也不能编译,一直报错。
不知道begin开始之后如何写一个有参数的cursor。
还有,取得值之后,取得数据的时候希望只取记录集中第一条数据,loop该怎么写呢?
谢谢大家。

解决方案 »

  1.   

    cursor定义是不能写在begin后的.只能放在变量定义区,例:
    procedure test is
      v_name varchar2(100);
      cursor cur1 is select * from t1 where field1=v_name;
    begin
     ....
    end;第二个问题比较奇怪,如果只要一条记录的话那还要cursor做什么,直接select就好了.
      

  2.   

    楼主切实需要变量,有不能使用楼上兄弟所说可以写一个 带参数的游标
    DECLARE 时候声明
      

  3.   

    关于第2个问题的原因是因为,某个sql语句取得了一个记录集,这个记录集是order by 过的。
    这样一来就可以取得想要的第一个数据。sql过于复杂单独用select 不能取得最小的那个纪录所以采用order by ,然后再取第一个数据的方式。
      

  4.   

    create or replace procedure test(s in varchar2) as
    cursor c1 is select * from t1;
    cursor c2(ss varchar2) is select * from t1 where id=ss;
    begin
    for v1 in c1 loop
      for v2 in c2(c1.id) loop
      ...
      end loop;
    end loop;
    end;
      

  5.   

    楼上的方法和我的方法是两种给游标加参数的方法,都可以使用。不过楼上的方法比较正规,和我的方法容易理解。当然在我的方法中,OPEN cursor之前是要给v_name变量赋值的。第二个问题,我想有两种方法,一种直接用select,例
      select * from (select * from t1 order by t1.order_col) where  rownum=1;
    一种就是定义游标后,不要用loop,直接读一条就好了:
      open cur1;
      fetch cur1 into v_col1,v_col2....
      close cur1;
    这样就只会取一条了。