ASP.NET调用存储过程出错,但PL/SQL中调试是正确的
分页存储过程如下:
create or replace procedure P_QuerySplit(
              sqlscript varchar2,     --表名/SQL语句 
              pageSize integer,       --每页记录数
              pageIndex integer,      --当前页
              docount number,         --是否计算总页数
              totalCount out number, --总记录数
              totalPage out number, --总页数
              v_cur out sys_refcursor --返回游标
      ) 
is
              v_PageSize number;
              v_PageIndex number;
              v_SQL_Count varchar2(4000);
              v_SQL varchar2(4000);
              v_StartIndex number;
              v_EndIndex number;
begin 
              v_PageSize:=pageSize;
              if v_PageSize=0 then 
                  v_PageSize:=1;
              end if;
              
              if(docount=1) then
                  --统计记录数量
                  v_SQL_Count := 'select count(*) from ('|| sqlscript ||') a ';
                  execute immediate v_SQL_Count into totalCount;
                  --计算总页数
                  totalPage:=CEIL(totalCount/v_PageSize);
              end if;
              
 
              --验证页号 如果页号大余了最大页数,返回最后一页
              v_PageIndex:=pageIndex;
              if v_PageIndex>totalPage then
                  v_PageIndex:=totalPage;
              end if;
              
              --计算开始的Index和结束的Index
              v_StartIndex:=(v_PageIndex-1)*v_PageSize+1;
              v_EndIndex:=v_PageIndex*v_PageSize;
              
              v_SQL:='SELECT * FROM (';
              v_SQL:=v_SQL||' SELECT A.*, ROWNUM RN ';
              v_SQL:=v_SQL||' FROM ('||sqlscript||') A ';
              v_SQL:=v_SQL||' WHERE ROWNUM <= '||v_EndIndex;
              v_SQL:=v_SQL||')WHERE RN >= '||v_StartIndex;
              
              open v_cur for v_SQL; 
end P_QuerySplit;ASP.NET程序调用:
DataTable dtData = this.QuickPage("select A.MT_COMM_ADDR,B.CUSTOMER_NAME from ipara_mtrpoint A, IPARA_RESIDENT B WHERE A.ACTUAL_CUSTOMER_ID = B.CUSTOMER_ID", 10, int.Parse(this.lbCurrentPage.Text), 1, ref totalCount, ref totalPage);
错误提示:
ORA-00942: 表或视图不存在
ORA-06512: 在"HX8000.P_QUERYSPLIT", line 48
ORA-06512: 在line 1因为在PL/SQL中调试是通过的,但是ASP.NET调用就出现这个问题,请教各位解决??!!!

解决方案 »

  1.   

    补充
    单独调用
      DataTable dtData = this.QuickPage("select * from ipara_mtrpoint", 10, int.Parse(this.lbCurrentPage.Text), 0, ref totalCount, ref totalPage);
    DataTable dtData = this.QuickPage("select * from IPARA_RESIDENT ", 10, int.Parse(this.lbCurrentPage.Text), 0, ref totalCount, ref totalPage);是没问题的
      

  2.   

    如果在SQL 中调试正确,那么问题肯定在ASP代码上,这种问题我也遇到过多次.问题一般出在CS代码中创建SqlParamters的数据库数据类型与数据库中不同而引发错误.为检查你的ASP程序,可以新建一个网页,只添加一个Button,在其代码中调用存储过程,参数为你在SQL 中调试成功所用的数据.如果成功再换成你在主页面出错时的参数(设断点获取),比较一下
      

  3.   

    你这个不是直接写的sql语句吗?跟这个存储过程有什么关系?
      

  4.   

    SQL 语句是存储过程的一个参数
      

  5.   

    asp.net调用不清楚,我在vb.net里面调用是这样的:Dim conn As New OracleConnection(oradb)
            Try
                conn.Open()
                Dim cmd As New OracleCommand
                cmd.Connection = conn
                cmd.CommandText = "hr_package.hr_update_amtsold('" & p_month & "')"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.ExecuteNonQuery()                    Catch ex As Exception
                MessageBox.Show(ex.Message.ToString())
               
            End Try
      

  6.   

    OracleConnection conn = new OracleConnection(connString);
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.CommandText = "P_QuerySplit";
            cmd.CommandType = CommandType.StoredProcedure;        cmd.Parameters.Add("sqlscript", OracleType.VarChar, 50);    //表名/SQL语句 
            cmd.Parameters["sqlscript"].Direction = ParameterDirection.Input;
            cmd.Parameters["sqlscript"].Value = sqlscript;        cmd.Parameters.Add("pageSize", OracleType.Float);          //每页记录数
            cmd.Parameters["pageSize"].Direction = ParameterDirection.Input;
            cmd.Parameters["pageSize"].Value = pageSize;        cmd.Parameters.Add("pageIndex", OracleType.Float);         //当前页
            cmd.Parameters["pageIndex"].Direction = ParameterDirection.Input;
            cmd.Parameters["pageIndex"].Value = pageIndex;
            cmd.Parameters.Add("docount", OracleType.Float);         //是否计算总页数
            cmd.Parameters["docount"].Direction = ParameterDirection.Input;
            cmd.Parameters["docount"].Value = docount;        cmd.Parameters.Add("totalCount", OracleType.Float);        //总记录数
            cmd.Parameters["totalCount"].Direction = ParameterDirection.Output;
            cmd.Parameters["totalCount"].Value = 0;        cmd.Parameters.Add("totalPage", OracleType.Float);         //总页数
            cmd.Parameters["totalPage"].Direction = ParameterDirection.Output;
            cmd.Parameters["totalPage"].Value = 0;        cmd.Parameters.Add("v_cur", OracleType.Cursor);             //返回的游标
            cmd.Parameters["v_cur"].Direction = ParameterDirection.Output;        DataSet Ds = new DataSet();
            OracleDataAdapter adapter = new OracleDataAdapter(cmd);
            adapter.Fill(Ds);
            conn.Close();
      

  7.   

    cmd.CommandType = CommandType.StoredProcedure
    别忘了这句,默认是SQL语句的。
      

  8.   

    存储过程中的参数:
    create or replace procedure P_QuerySplit(
                  sqlscript varchar2,     --表名/SQL语句 
                  pageSize integer,       --每页记录数
                  pageIndex integer,      --当前页
                  docount number,         --是否计算总页数
                  totalCount out number, --总记录数
                  totalPage out number, --总页数
                  v_cur out sys_refcursor --返回游标
          ) ASP.NET调用参数:
    cmd.Parameters.Add("sqlscript", OracleType.VarChar, 50);    //表名/SQL语句 
            cmd.Parameters["sqlscript"].Direction = ParameterDirection.Input; 
            cmd.Parameters["sqlscript"].Value = sqlscript;         cmd.Parameters.Add("pageSize", OracleType.Float);          //每页记录数 
            cmd.Parameters["pageSize"].Direction = ParameterDirection.Input; 
            cmd.Parameters["pageSize"].Value = pageSize;         cmd.Parameters.Add("pageIndex", OracleType.Float);        //当前页 
            cmd.Parameters["pageIndex"].Direction = ParameterDirection.Input; 
            cmd.Parameters["pageIndex"].Value = pageIndex; 
            cmd.Parameters.Add("docount", OracleType.Float);        //是否计算总页数 
            cmd.Parameters["docount"].Direction = ParameterDirection.Input; 
            cmd.Parameters["docount"].Value = docount;         cmd.Parameters.Add("totalCount", OracleType.Float);        //总记录数 
            cmd.Parameters["totalCount"].Direction = ParameterDirection.Output; 
            cmd.Parameters["totalCount"].Value = 0;         cmd.Parameters.Add("totalPage", OracleType.Float);        //总页数 
            cmd.Parameters["totalPage"].Direction = ParameterDirection.Output; 
            cmd.Parameters["totalPage"].Value = 0;         cmd.Parameters.Add("v_cur", OracleType.Cursor);            //返回的游标 
            cmd.Parameters["v_cur"].Direction = ParameterDirection.Output; 
      

  9.   

    我咋没看出你在哪调这个存储过程?调用的时候要写上: 包名.过程名
    如:
    包名为pkg
    则:pkg.P_QuerySplit,这样调
      

  10.   

    cmd.CommandText = "P_QuerySplit"; //这里把你的包名也加上如:pkg.P_QuerySplit
    cmd.CommandType = CommandType.StoredProcedure; 
      

  11.   

    CREATE OR REPLACE PACKAGE PKG is
      TYPE myrctype IS REF CURSOR;
      PROCEDURE P_QuerySplit(sqlscript varchar2,
                  pageSize number,
                  pageIndex number,
                  docount number,
                  totalCount out number,
                  totalPage out number,
                  v_cur out OUT myrctype);
    end PKG;
    CREATE OR REPLACE PACKAGE BODY PKG AS
    procedure P_QuerySplit( 
                  sqlscript varchar2,    --表名/SQL语句 
                  pageSize integer,      --每页记录数 
                  pageIndex integer,      --当前页 
                  docount number,        --是否计算总页数 
                  totalCount out number, --总记录数 
                  totalPage out number, --总页数 
                  v_cur out OUT myrctype --返回游标 
          ) 
    is 
                  v_PageSize number; 
                  v_PageIndex number; 
                  v_SQL_Count varchar2(4000); 
                  v_SQL varchar2(4000); 
                  v_StartIndex number; 
                  v_EndIndex number; 
    begin 
                  v_PageSize:=pageSize; 
                  if v_PageSize=0 then 
                      v_PageSize:=1; 
                  end if; 
                  
                  if(docount=1) then 
                      --统计记录数量 
                      v_SQL_Count := 'select count(*) from ('|| sqlscript ||') a '; 
                      execute immediate v_SQL_Count into totalCount; 
                      --计算总页数 
                      totalPage:=CEIL(totalCount/v_PageSize); 
                  end if; 
                                --验证页号 如果页号大余了最大页数,返回最后一页 
                  v_PageIndex:=pageIndex; 
                  if v_PageIndex>totalPage then 
                      v_PageIndex:=totalPage; 
                  end if; 
                  
                  --计算开始的Index和结束的Index 
                  v_StartIndex:=(v_PageIndex-1)*v_PageSize+1; 
                  v_EndIndex:=v_PageIndex*v_PageSize; 
                  
                  v_SQL:='SELECT * FROM ('; 
                  v_SQL:=v_SQL||' SELECT A.*, ROWNUM RN '; 
                  v_SQL:=v_SQL||' FROM ('||sqlscript||') A '; 
                  v_SQL:=v_SQL||' WHERE ROWNUM <= '||v_EndIndex; 
                  v_SQL:=v_SQL||')WHERE RN >= '||v_StartIndex; 
                  
                  open v_cur for v_SQL; 
    end P_QuerySplit;
    end PKG;调用:OracleConnection conn = new OracleConnection(connString); 
            OracleCommand cmd = new OracleCommand(); 
            cmd.Connection = conn; 
            cmd.CommandText = "pkg.P_QuerySplit"; 
            cmd.CommandType = CommandType.StoredProcedure;         cmd.Parameters.Add("sqlscript", OracleType.VarChar, 50);    //表名/SQL语句 
            cmd.Parameters["sqlscript"].Direction = ParameterDirection.Input; 
            cmd.Parameters["sqlscript"].Value = sqlscript;         cmd.Parameters.Add("pageSize", OracleType.Float);          //每页记录数 
            cmd.Parameters["pageSize"].Direction = ParameterDirection.Input; 
            cmd.Parameters["pageSize"].Value = pageSize;         cmd.Parameters.Add("pageIndex", OracleType.Float);        //当前页 
            cmd.Parameters["pageIndex"].Direction = ParameterDirection.Input; 
            cmd.Parameters["pageIndex"].Value = pageIndex; 
            cmd.Parameters.Add("docount", OracleType.Float);        //是否计算总页数 
            cmd.Parameters["docount"].Direction = ParameterDirection.Input; 
            cmd.Parameters["docount"].Value = docount;         cmd.Parameters.Add("totalCount", OracleType.Float);        //总记录数 
            cmd.Parameters["totalCount"].Direction = ParameterDirection.Output; 
            cmd.Parameters["totalCount"].Value = 0;         cmd.Parameters.Add("totalPage", OracleType.Float);        //总页数 
            cmd.Parameters["totalPage"].Direction = ParameterDirection.Output; 
            cmd.Parameters["totalPage"].Value = 0;         cmd.Parameters.Add("v_cur", OracleType.Cursor);            //返回的游标 
            cmd.Parameters["v_cur"].Direction = ParameterDirection.Output;         DataSet Ds = new DataSet(); 
            OracleDataAdapter adapter = new OracleDataAdapter(cmd); 
            adapter.Fill(Ds); 
            conn.Close();
      

  12.   


    在你的过程中open v_cur for v_SQL这前输出一下看看你拼的sql是什么dbms_output.put_line(v_SQL);在pl/sql里调试一下.pl/sql中单独表也没问题吗?联合查询就有问题?
    在pl/sql中看一下联合查询拼出来的sql是啥.
      

  13.   

    我快要投向了
    ORA-00942: 表或视图不存在
    ORA-06512: 在"HX8000.PKG", line 27
    ORA-06512: 在line 1
      

  14.   

    问题在这里:
    sqlscript varchar2,    --表名/SQL语句 如果我传的长度过长就变成下面的了SELECT A.MTRPOINT_DESC,B.CUSTOMER_ID FROM IPARA_M就是我说传的SQL语句被他截取了
      

  15.   

    唉  
    cmd.Parameters.Add("sqlscript", OracleType.VarChar, 4000);    //表名/SQL语句 惭愧惭愧啊