存储过程返回数据集用ref cursor
根据用的数据库引擎的不同,例如BDE或者ADO,调用方法也不同

解决方案 »

  1.   

    我用的是ado,请问如何调用呢?
      

  2.   

    这是以前我在大富翁回答别人的:
    例如查询scott下面的emp
    1.建包,定义游标类型和过程
    create or replace Package pkg_demo
    AS
       TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
       procedure open_emp_cv(emp_cv OUT EmpCurTyp);
    END pkg_demo;
    2。定义包体
    create or replace package body pkg_demo 
    AS
    procedure open_emp_cv (emp_cv OUT EmpCurTyp) 
    IS
    BEGIN
       OPEN emp_cv FOR SELECT * FROM emp;
    END open_emp_cv;
    end pkg_demo;
    3。建立ado连接,注意用oracle的provider,连接字符串里包含“PLSQLRSet=1”
    ADOConnection1.ConnectionString:='PLSQLRSet=1;Provider=OraOLEDB.Oracle;Password=tiger;Persist Security Info=True;User ID=scott;Data Source=fjddmis;Extended Properties=""';
    ADOConnection1.Open;
    4。用TADODataset调用存储过程,注意调用格式
    ADODataSet1.Connection:=ADOConnection1;
    ADODataSet1.CommandText:='{call pkg_demo.open_emp_cv}';
    ADODataSet1.CommandType:=cmdText;
    ADODataSet1.Open; 
      

  3.   

    TO:nebulaly(nebulaly) 
    ----------------------------
    谢谢,我以解决问题,顺便再问一个问题,为什么返回的数据集不能在DBGRID中编辑。
      

  4.   

    用OPEN emp_cv FOR SELECT * FROM emp for update 试试但是我不建议用数据敏感控件
      

  5.   

    to:nebulaly(nebulaly) 
    ---------------------------------
    为什么?是和效率有关吗?谢谢!
      

  6.   

    效率低是一方面
    关键问题是为了保证数据完整性,需要控制数据敏感控件做post,还不如不用数据敏感控件