我有一个MFC对话框程序通过ADO访问oracle数据库,数据库里面有一张product表,里面有id,name,price三个字段,对话框界面上面也有个列表,有三列,ID,名字,价格
我原来是通过ado执行select * from product,通过结果集指针来获取到查询的结果,然后插入到列表当中的
但是我现在有个需求就是我想把select * from product这句话放到存储过程当中,然后用ado来执行存储过程,来获取结果集,从而提取记录吧信息显示到对话框的列表当中
现在就遇到这个问题 
1.这个存储过程该怎么写?
2.ADO该怎么调用执行这个存储过程并获取结果集?

解决方案 »

  1.   

    Oracle存储过程返回结果集,需要用到游标cursor类型
    存储过程设置一个out参数,在程序里面直接接收输出的参数
    如果是9i以前的版本没有sys_refcursor,需要自己定义一个游标的类型。
    具体示例如下:CREATE OR REPLACE Procedure sp_GetData(x_mycursor out sys_refcursor)
    is
    Begin
      Open x_mycursor for Select * From Sys_User;
    End sp_GetData;
      

  2.   

    比如我的程序里面有
    _ConnectionPtr m_pConnection;(假设已经连接好了数据库)
    _RecordsetPtr m_pRecordset;
    _CommandPtr m_pCommand;
    这三个智能指针
    我按照你说的,准备好sql语句
    CString strSql = "call sp_GetData(x_mycursor)";
    然后通过
    m_pRecordset->Open(strSql, (IDisatch*)m_pConnection, adOpenDynamic, adLockOptimistic, adCmdText);
    来执行调用数据库中的存储过程,可是我该怎么来获取这条语句返回出的x_mycursor的游标呢?x_mycursor这个可是一个字符串啊没法接收从数据库出来的数据啊
      

  3.   

    我按照你说的方式写了一个两个存储过程
    第一个编译通过
    create or replace procedure sp_test
    (ref_cursor out sys_refcursor)
    as
    begin
    open ref_cursor for select * from products;
    end sp_test;第二个存储过程调用第一个的可是编译出现问题
    create or replace procedure call_sp 
    as
    ref_cursor sys_refcursor;
    begin
    call sp_test(ref_cursor);
    end call_sp;编译时说"PLS-00103:出现符号"SP_TEST"在需要下列之一时::=.(@%;符号":="被替换为"SP_TEST"后继续"
    我用的是PL/SQL Developer软件,一下不知道这该怎么解决了
      

  4.   

    存储过程中调用过程不要call,直接写过程名称加参数就可以了