由于一直使用Sqlserver所以 首次使用Oracel 就碰到问题
比方Sqlserver要查询 要返回所有结果集  就用SELECT *
而Oracel 从网上好像要用游标或包,我一直不杂喜欢游标,所以用包,
现在我也不清楚包是个什么东西,我是Oracel盲 暂时为了进度
从网上找到一个例子,原文如下 这是最简单的例子,oracle存储过程返回数据集要比sqlserver麻烦的多,用惯sql的人可能会非常不习惯,下面做了个最简单的例子。
首先建个包:
create or replace package temppkg
is 
type mytable is ref cursor;
procedure Get_Template(cur_mytable out mytable);
end; create or replace package body temppkg
is 
procedure Get_Template(cur_mytable out mytable)
is
begin
          open cur_mytable for select * from tj_template_data;
end Get_Template;
end temppkg; c#里:            OracleConnection con = new OracleConnection(strConnection);
            OracleCommand comm = new OracleCommand("temppkg.Get_Template", con);
            comm.Parameters.Add("cur_mytable", OracleType.Cursor);
            comm.Parameters[0].Direction = ParameterDirection.Output;
            comm.CommandType = CommandType.StoredProcedure;
            DataSet ds = new DataSet();
            OracleDataAdapter ada = new OracleDataAdapter();
            ada.SelectCommand = comm;
            ada.Fill(ds, "mytable");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = ds.Tables[0].TableName;
测试已经通过
但是问题来了
我想在包中再加一条存储过程 加进去 编译通过了但是包错了create or replace package temppkg
is 
type mytable is ref cursor;
procedure Get_Template(cur_mytable out mytable);
procedure Get_TemplateA(cur_mytable out mytable);
end;
过程的创建拷贝Get_TemplateA的create or replace package body temppkg
is 
procedure Get_Template(cur_mytable out mytable)
is
begin
          open cur_mytable for select * from tj_template_data;
end Get_Template;
end temppkg;create or replace package body temppkg
is 
procedure Get_TemplateA(cur_mytable out mytable)
is
begin
          open cur_mytable for select * from tj_template_data;
end Get_TemplateA;
end temppkg;再次调用 报错 但编译通过了 
谢谢 求解答
分不多了 不好意思

解决方案 »

  1.   

    我不懂ORACLE 但是 这个写法 感觉还行
    我简单理解成 SQLSERVER 的架构下的 一个方法 我知道是个错误理解麻烦 帮我看看问题吧SQLSERVER 没有这个ORACLE包的概念 有另一个ETL包 
      

  2.   

    现在不需要自己去通过包定义个refcursor类型了,可以直接使用sys_refcursor定义动态游标.
      

  3.   

    SQL> CREATE OR REPLACE PROCEDURE proc_get_ename(i_empno NUMBER,
      2                                             o_cur   OUT SYS_REFCURSOR) AS
      3  BEGIN
      4    OPEN o_cur FOR
      5      SELECT empno, ename FROM emp WHERE empno = i_empno;
      6  END;
      7  /Procedure created.SQL> var v_a refcursorSQL> exec proc_get_ename(7369,:v_a);PL/SQL procedure successfully completed.SQL> print v_a     EMPNO ENAME
    ---------- ----------
          7369 SMITHSQL>