看同事在存储过程中的查询中游标都是像变量一样定义。请问如何自定义一个这样的游标,写法是什么?例如:
Create Or Replace Proc p_xxxxxx
(
   p_x      in number,
   p_x      in varchar2,
   p_cursor out sysXXX
)
Open p_cursor For
 Select * Form * Where * = * ;
End p_xxxxxx;谢谢~

解决方案 »

  1.   

    -- 给个例子给你:-- 实例:Oracle存储过程返回数据集CREATE table userinfo(id number(18,0), name varchar2(30), sex varchar2(10), age number(3,0), address varchar2(100));insert into userinfo(id,name,sex,age,address) values(1,'luoyoumou','男',33,'湖南省衡阳市');
    insert into userinfo(id,name,sex,age,address) values(2,'miaoxiaoming','男',32,'江西省吉安市');
    insert into userinfo(id,name,sex,age,address) values(3,'hanqiguang','男',28,'江西省赣州市');commit;create table userinfo2 as select * from userinfo where 1=2;-- i_address 是存储过程的输入参数,o_cur是存储过程的输出游标参数,用以获取返回的结果集!
    CREATE OR REPLACE PROCEDURE userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR)
    IS
      sqlstr VARCHAR2(200); -- 定义变量,用以存放SQL语句
    BEGIN
      sqlstr := 'SELECT Id, Name, Sex, Age, Address FROM userinfo WHERE Address = :i_address'; -- 给SQL变量赋值,其中 :i_address 是绑定变量,以提高执行效率!
      OPEN o_cur FOR sqlstr USING i_address; -- 给游标变量赋值
    END;
    /
      

  2.   

    create or replace procedure sp_UpdateOrder as
      --更新订单状态(失效),更新号码表里的号码状态
      order_id VARCHAR2(500); --订单id
      v_time integer(10);
      cursor cur_order is
        select *
          from scm_order t
         where t.ordertype=1 and t.order_status=2 and t.checkstatus=1
           and (t.checktm + numtodsinterval(v_time, 'minute')) < sysdate;  cursor cur_number is
        select * from v_orderitemdetail b where b.order_id = order_id;
    begin
      select t.theinterval into v_time from scm_updatetime t where t.thetype='4' and rownum<2;--1是选号的,2是购物车的,3是批号的,4是订单失效的
      for rec in cur_order loop
          update scm_order t0
             set t0.order_status=17
           where t0.order_id = rec.order_id;      --改变号码表里的号码状态
          order_id := rec.order_id;
          for numitem in cur_number loop
            update scm_goods_simnumber a
               set a.simgoout = 0
             where a.numbername = numitem.mobilenum
               and a.simgoout = 1;
          end loop;
      end loop;
    end sp_UpdateOrder;
      

  3.   

    我常使用的有下列两种:
    1、游标不挂参数
    declare
     cursor 游标名 is select 字段1,字段2 from 表 [where 条件];
    begin
      for var_exp in 游标名 loop
         dbms_output.put_line(游标名.字段1 ||':'||游标名.字段2 );
      end loop;
    end;2、游标挂参数
    declare
     cursor 游标名(参数1 类型,参数2 类型) is select 字段1,字段2 from 表 where 条件1 = 参数1 and 条件2 = 参数2;
    begin
      for var_exp in 游标名(传入参数1,穿入参数2) loop
         dbms_output.put_line(游标名.字段1 ||':'||游标名.字段2 );
      end loop;
    end;格式不在于多,够用就行,呵呵
      

  4.   


    create or replace Procedure p_xxxxxx
    (
      p_x in number,
      p_x in varchar2,
      p_cursor sys_refcursor;
    )
    Open p_cursor For
     'Select * Form * Where * = * ';
    End;
    或者
    create or replace Procedure p_xxxxxx
    (
      type c is ref cursor
      p_x in number,
      p_x in varchar2,
      p_cursor c;
    )
    Open p_cursor For
     'Select * Form * Where * = * ';
    End;
      

  5.   


    请问一下 SYS_REFCURSOR 这个是自定义的还是ORACLE自己有的。
    如果是自定义,是如何定义?
    谢谢~
      

  6.   

    SYS_*一般是系统自带的!
      

  7.   


    ORACLE系统游标类型,OUT参数都这么整