如果你是像我一样初次使用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;

PLS-00306:错误解决思路 - OracleHelper 执行Oracle函数的坑的更多相关文章

  1. gerrit代码审核工具之“error unpack failed error Missing unknown”错误解决思路

    使用gerrit代码审核工具时遇到error: unpack failed: error Missing unknown d6d7c89bd1d77f44c5c8e99437aaffbfc0684e7 ...

  2. java.lang.NoClassDefFoundError 错误解决思路

    Process: com.oppo.reader, PID: 20472 java.lang.NoClassDefFoundError: com.zhangyue.iReader.PDF2.ui.PD ...

  3. 043 关于 loadrunner 返回 http 500 错误解决思路

    这个支持项目中,总是出现500的问题,后来发现是redis总是崩掉. 后来,在压力测试,500的问题,又开始不断出现,虽然不是我自己处理的,但是没少吃苦头. 看了这篇文章,感觉说的还是很有道理,如何来 ...

  4. Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(安装方面)

    前言:第一次接触数据库,想下载个oracle试玩下(虽然听说一般大企业才用),到 官网下载 了个简易版 XE 版本,安装时要注意记住自己输入的数据库密码(口令)  还有安装路径不能含有空格(Do no ...

  5. 在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法。

    在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法. 先确定 libclntsh.so.11.1 所在目录: [oracle@localhost ~] ...

  6. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  7. Oracle协议适配器错误解决办法

    在Oracle中新建了一个数据库,今天把它删了之后再登录SQL*PLUS就登不上去了,出现ORA-12560:TNS:协议适配器错误. ORA-12560: TNS: 协议适配器错误的解决方法 造成O ...

  8. 解决IE上登陆oracle OEM时报:“证书错误,导航已阻止”的错误

    今天在IE上登陆OEM时,报证书错误,导航已阻止,我选择:继续浏览此网站(不推荐),但是点了之后还没有反应,在网上搜了很多,原因基本都是windows的问题,最后发现问题是:oracle oem证书的 ...

  9. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法

    Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法 登陆数据库时提示 “ORA-01033”错误在命令窗口以s ...

随机推荐

  1. PH获取当前url路径及服务器路径汇总 (url 获取当前路径 服务器路径)

    以下是整理的一些, php中获取路径的小知识, 希望对你有所帮助! 1,$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2,$_SERVER[& ...

  2. display:block; 块级元素。<a>,<span>标签设置宽度和高度

    display:block;是让对象成为块级元素(比如a,span等) 转化后 可以对a或者span标签进行width和height设置,否则设置不了 display有很多对象,具体可以参考http: ...

  3. compass(sass)+seajs+frozenui+frozenjs+svn主干分支

    1.compass框架 sass编译 1.compass create 项目名 2.cd目录,执行compass watch 2.frozen框架 js(frozen.js),css(global.c ...

  4. 使用.htaccess进行浏览器图片文件缓存

    对于图片类网站,每次打开页面都要重新下载图片,慢不说,还非常浪费流量.这时就需要用到缓存,强制浏览器缓存图片文件 缓存文件,提问网站访问数度,减少流量消耗,现提供2中缓存代码 打开.htaccess文 ...

  5. E8.NET工作流平台如何与其他软件系统集成?

    1.与邮件系统集成 E8.Net工作流开发架构已经提供了与电子邮件系统集成的模块,可以轻松实现与EXCHANGE等专业邮件系统集成的应用需求. 2.与短信系统集成 E8.Net工作流架构已经提供了手机 ...

  6. dtv_driver.ko

            替换dtv_driver.ko .步骤:         shell@android:/ # get_rootfs.sh                                 ...

  7. 一步步学习NHibernate(1)——NHibernate介绍

    请注明转载地址:http://www.cnblogs.com/arhat 第十五章 从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的 ...

  8. 导入NGUI插件

    在Unity编辑器顶部菜单栏中的Assets菜单中选择Import Package,然后选择Custom Package(自定义资源包),弹出资源路径窗口,在其中找到NGUI资源包所在的位置,单击”打 ...

  9. CODEVS 3657 括号序列

    [问题描述] 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例 ...

  10. 解决Win8.1 / Win Server 2012 r2 下安装 Visual Studio 时一直要求重新启动的问题(原创)

    注:本文为作者原创文章,转载于引用请注明出处,谢谢. 今天在x64的英文版Windows Server 2012 r2上安装最新版的 Visual Studio 2015 Exterprise 时,提 ...