zoukankan      html  css  js  c++  java
  • PLS-00306:错误解决思路

    如果你是像我一样初次使用Net+Oracle的结合,我想你会跟我一样,有很大的概率碰到这个问题

    =======================================================
    PLS-00306: wrong number or types of arguments in call to '存储过程名'
    orA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    =======================================================

    或者说像这样子的:

    pls-00306 调用 时参数个数或类型错误


    如果没有经验的话,就会一头雾水到处乱撞。我也是被这个搞得很痛苦了,我把自己解决这问题思路与大家分享一下,希望能对您有所帮助.

    Step1:确认你的Oracle包中的存储过程中的参数的总数,是否与您在Net中调用存储过程中的参数保持一致的数目。还有就是要注意function传参与procedure传参的参数的不同写法.

    function传参的时候需要加入:号
    例如:


    Step2:确认你在Oracle包中的存储过程的参数的数据类型,是否能与您在Net中调用存储过程中的参数的数据类型匹配


    Step3:确认你在Net应用程序中所使用的连接存储过程和获取返回值的方法是否正确..

    这主要是在使用function的时候与使用procedure的时候,当需要获取存储过程或包中的返回的值的时候需要注意的不同方法.一般我们在获取function的返回值的时候使用的是

    new oracleParameter(":P_PRICEFORMID",OracleType.VarChar,20),
    new oracleParameter(":P_VENDOR_CODE",OracleType.VarChar,20),
    new oracleParameter(":P_VENDOR_SITE_CODE",OracleType.VarChar,20),
    new oracleParameter(":P_VAT_CODE",OracleType.VarChar,20),
    new oracleParameter(":P_ITEM_CODE",OracleType.VarChar,20),:

    而使用procedure的时候是不用:号的


    Step4:确认你所传入Oracle中的各参数的值是否会出现null值.

    在 传入参数过多的时候,这里面的问题很难发现.只能通过一个一个值传入去测试.所以最好的解决办法是将所要传入的参数都给定一个默认值,同时要注意数据类型 的匹配.尽量避免null值和空值的传入. 有些情况下使用VS的断点去追踪,明明看见有值,可以在传入oracle表内就会没值,这种情况要特别注意.我就是碰到这样的情况了.


    Step5:确认你的服务器端Oracle版本是否与你在客户端Oracle的版本保持一致.

    有 些时候因为在不同的客户端版本下所编译的包的结果会有所差异,比如我在8i的情况下编译通过,有可能在9i的版本就会通不过,这可能与pl/sql的语法 规定有关.所以尽量保持客户端与服务器的oracle版本一致.最好的判断办法就是看看 sql plus的版本是否是一致.


    我拿自己在实际过程中碰到的一个例子来说明吧.
    见:
    http://topic.csdn.net/u/20091019/00/8f05ee3b-e41c-4aff-bafd-a68d47f8eebf.html

    我报的错是这样的:
    报错如下:

    orA-06550: line 1, column 7:
    PLS-00306: wrong number or types of arguments in call to 'InsertTOEBSCODE'
    orA-06550: line 1, column 7:
    PL/SQL: Statement ignored

    我的问题是:在本机上测试正常,放至服务器上就出现问题了.最终找到的根缘在于我有个字段传了个null值或是没有传入值进入,导至报错.我是一个一个字段去把这原因找出来的.虽说有点笨拙,但还是把问题给找出来了.




    我的操作类中的方法:

    这里要注意几点的是:

    1.要获取包中存储过程返回的值,需要这样写
    parameters[13].Direction=ParameterDirection.Output;
    2. 注意C#与Oracle的时间转换 一般最好的解决方法是在C#中设置成string类型,然后在Oracle中通过to-date()函数把它转化成时间格式.一开始我也是在这碰了个丁 子,后来通过在c#传入所要的时间格式,在oracle中转换成要用的时间格式即可.
    parameters[5].Value = effectiveDate.ToString("yyyy-MM-dd hh:mm:ss");
    要规定格式是因为考虑在服务器端是英文操作系统,所得到的默认时间格式与客户端所提交的不同.所以需要根据服务器端的系统环境进行时间格式的设置.



    ///
            /// 插入已OK的价格至EBS中
            ///
            ///
            ///
            public bool InsertToEBS(Entity.CAS.PriceFormInfo priceForm)
            {
                oracleParameter[] parameters =
                {
                    new oracleParameter("P_PRICEFORMID",OracleType.VarChar,20),
                    new oracleParameter("P_VENDOR_CODE",OracleType.VarChar,20),
                    new oracleParameter("P_VENDOR_SITE_CODE",OracleType.VarChar,20),
                    new oracleParameter("P_VAT_CODE",OracleType.VarChar,20),
                    new oracleParameter("P_ITEM_CODE",OracleType.VarChar,20),
                    new oracleParameter("P_EFFECTIVE_DATE",OracleType.VarChar,20),
                    new oracleParameter("P_PURCHASER",OracleType.VarChar,20),
                    new oracleParameter("P_CHECKER",OracleType.VarChar,20),
                    new oracleParameter("P_AUDITOR",OracleType.VarChar,20),
                    new oracleParameter("P_POCT",OracleType.VarChar,10),
                    new oracleParameter("P_UNIT_PRICE",OracleType.VarChar,20),
                    new oracleParameter("P_PASSED_DATE",OracleType.VarChar,20),
                    new oracleParameter("P_TERMS_DESC",OracleType.VarChar,100),
                    new oracleParameter("v_retval",OracleType.Number)

                };


                parameters[0].Value = priceForm.FormID.ToString();
                parameters[1].Value = priceForm.SupplierCode;
                parameters[2].Value = priceForm.Vendor_site_code;
                parameters[3].Value = priceForm.Tax.ToString();
                parameters[4].Value = priceForm.MaterialCode.Trim();


                DateTime effectiveDate= Convert.ToDateTime(priceForm.EffectiveDate.ToString());

                DateTime passedDate= Convert.ToDateTime(priceForm.PassedDate.ToString());

            

                if (priceForm.EffectiveDate > priceForm.PassedDate)
                {


                    parameters[5].Value = effectiveDate.ToString("yyyy-MM-dd hh:mm:ss");

              
                }
                else
                {
                    parameters[5].Value = passedDate.ToString("yyyy-MM-dd hh:mm:ss");
                }
                parameters[6].Value = priceForm.Purchaser;
                parameters[7].Value = priceForm.Checker;
                parameters[8].Value = priceForm.Auditor;
                parameters[9].Value = priceForm.POCT;
                parameters[10].Value = priceForm.Price.ToString();
                parameters[11].Value = passedDate.ToString("yyyy-MM-dd hh:mm:ss");
                parameters[12].Value = priceForm.Payment.ToString().Trim();
                parameters[13].Direction=ParameterDirection.Output;

              

                try
                {
                    Convert.ToInt32(OracleHelper.ExecuteNonQuery(OracleHelper.ConnectionStringProfile, CommandType.StoredProcedure, "PO_CAS_PRICE_PKG.InsertToEBSCode", parameters));

                    int retval = Convert.ToInt32(parameters[13].Value);

                    if (retval == 1)
                    {
                        return true;
                    }
                    else

                        return false;
                }
                catch (Exception ee)
                {
                    throw ee;
                }
                finally
                {

                }

    包中的存储过程
    中的存储过程:

    create or replace package PO_CAS_PRICE_PKG is

      -- Author  : EASTJAZZ
      -- Created : 2009-10-16 0:29:13
      -- Purpose :

      procedure InsertToEBSCode(P_PRICEFORMID      IN VARCHAR2,
                                P_VENDOR_CODE      IN VARCHAR2,
                                P_VENDOR_SITE_CODE IN VARCHAR2,
                                P_VAT_CODE        IN VARCHAR2,
                                P_ITEM_CODE        IN VARCHAR2,
                                P_EFFECTIVE_DATE  in VARCHAR2,
                                P_PURCHASER        IN VARCHAR2,
                                P_CHECKER          IN VARCHAR2,
                                P_AUDITOR          IN VARCHAR2,
                                P_POCT            IN VARCHAR2,
                                P_UNIT_PRICE      IN VARCHAR2,
                                P_PASSED_DATE      IN VARCHAR2,
                                P_TERMS_DESC      IN VARCHAR2,
                                v_retval          out number);

    end PO_CAS_PRICE_PKG;


    调用函数取得返回值的Example


    public string GetItemDescription(string item_code, int org_id)
           {
               oracleParameter[] Parms =
               {
                  
                   new oracleParameter("p_item_code",OracleType.VarChar,20),
                   new oracleParameter("p_org_id",OracleType.Number,4),
                   new oracleParameter("v_item_desc",OracleType.VarChar,150)
               };

               Parms[0].Value = item_code;
               Parms[1].Value = org_id;
               Parms[2].Direction = ParameterDirection.ReturnValue;


               IList vendorItemList = new List();

               oracleHelper.ExecuteNonQuery(OracleHelper.ConnectionStringProfile, CommandType.StoredProcedure, "PO_VENDORS_PKG.GetItemDescription", Parms);

             return Parms[2].Value.ToString().Trim();
           }



    Function:

      function GetItemDescription(p_item_code in varchar2, p_org_id number)
        return varchar2 is
        v_item_desc varchar2(150);
      begin
      
        select msib.DESCRIPTION item_desc
          into v_item_desc
          from MTL_SYSTEM_ITEMS_B msib
        
         where msib.SEGMENT1 = trim(p_item_code)
           and msib.ORGANIZATION_ID = p_org_id;
      
        return v_item_desc;
      
      end GetItemDescription;

  • 相关阅读:
    DBCP数据库连接池
    Java Ant build.xml详解
    AWK 用法
    java打jar包
    linux 下java jar包的方法
    linux下java命令行引用jar包
    java webservice
    设计模式的几大原则
    ContextLoaderListener
    WebApplicationContextUtils源码
  • 原文地址:https://www.cnblogs.com/jimcsharp/p/5603845.html
Copyright © 2011-2022 走看看