求教大侠,需要一个ORACLE高手存储过程返回记录集,我用的客户端是VB6的,  找了很久,看了很多,不太看得懂,
 
  希望论坛的大哥,帮帮忙。

解决方案 »

  1.   

    ------- 给个例子给你: -- 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;
    /set serveroutput on;
    var c_cur refcursor;
    exec userinfo_proc('北京',:c_cur);
    print c_cur;
      

  2.   

    汗,这样就不是存储过程了~~
    不过你也可以写SQL来代替存储过程的啊,你如果不会用VB6来调用返回结果集的存储过程,那你还是直接写SQL而不必写存储过程吧。
    ——按你的情况,你也可以把存储过程的结果集合的数据写到数据库的临时表,然后你VB6直接读取临时表里面的数据就可以了~这个还是要看你的系统的业务规则来顶的~
    存储过程不难啊,,,ORACLE跟SQL SERVER确实返回结果集的存储过程有点不一样,ORACLE必须建立一个包——包头和包体,包头是一些定义,包体是一些实现,返回在包头里面定义的游标,然后你在VB6里面调用这个游标结果集就可以了~
    GOOGLE上面应该很多例子的,如果不懂,可以到VB下去问怎么调用。此 
      礼!
      

  3.   

    对对对,楼上说的是的,oracle存储过程返回记录集是复杂我在SQL上建立测试的存储过程,可以用水晶报表数据专家连接,得到数据,而oracle建立的存储过程,建立好后procedures里面是ok的,但是用水晶报表数据专家连接到这个存储过程不能用, 我想应该是楼上的说的,要先建立包头,包体,我其实提问就是要这个例子, 我之前测试过在VB6直接写查询,因数据超过400万条所以数据慢,后来考虑用临时表,然后再用了视图,感觉视图是可以的,但是视图不能加密,---没办法我只能考虑存储过程了, 能给一个有表的例子吗?
      

  4.   


     我有一个查询语句,在视图是可以用的,是阿泰指导写的, 举例子: create or replace view test as  select × from aaa  where 重量 <50, 实际上视图比这个复杂多了, 然后我在VB里用TEST这个视图,但是视图用WRAP不能加密,但存储过程可以加密, 所以我把这个视图修改成存储过程,用这个存储过程返回像视图TEST这样的记录集,  请问这个存储过程该怎么写呢?
      

  5.   

    视图应该是可以加密的吧~~~通过SCHEMA可以的。你想要例子啊,这个也可以的~~~~很简单的啊-等下我给你列个
      

  6.   

    oracle视图加密了,还要可以在oracle里使用的,谢 谢啦··
      

  7.   


    create table test1  --建立测试表
    (
       tname varchar2(10),
       tclass varchar2(10),
       tscore int
    );insert into test1 select '无念','一年级','98' from dual union all --插入测试数据
    select '无缘','二年级','99' from dual union all
    select '无尘','三年级','95' from dual union all
    select '无法','四年级','59' from dual;
    commit;
    create or replace package tpk  --包头
    is
    type tcur is ref cursor; --定义返回的结果集
    procedure t_p(t_name varchar2 , t_cur out tcur);--定义存储过程
    end;
    /create or replace package body tpk --包体
    is
    procedure t_p(t_name varchar2 , t_cur out tcur)--存储过程的实现
    is
    begin
    open t_cur  for select * from test1 where test1.tname =t_name;--游标记录结果集
    end t_p;
    end tpk;
    /--在PL/SQL DEVELOPER里面测试一下吧,存储过程是在包体中的 调用存储过程要写包体的名称,例如tpk.t_p如此
      

  8.   

    其实视图加密这个——我只在SQL SERVER里面用过,,关于ORACLE没有用过这个玩意——
    加密的意义不大,你只不过不想别人看到你的实现?现在制作报表,可以用制作报表的单独工具啊,水晶报表好像已经N年了吧——有很多出名的报表工具,以及ETL工具。利用这些平台来开发报表的话,可以省去很多存储过程的,而且可能效率上也会有提高。--不过不知道你要开发的是虾米样的报表,如果只是简单的,写几个SQL就可以了,根本不用加密啊,要加密啊在文本上对称加密读写就可以~~(ORACLE不知道有没有像SQL的视图加密),你也可以考虑把加密的SQL存放在数据库里面的。==方法很多吧,偶只是胡乱说一下,哈,希望对你有点帮助
      

  9.   

    我正在学着写,你上面给我的SQL,哈 哈··· 我先试试···啦···
      

  10.   

    1楼的例子很好,现在有了sys_refcursor类型,根本不需要自己再定义包什么的了。
      

  11.   

    我 用sys_refcursor,已经把,存储过程写好了,非常感谢,大家,结贴啦···