将数组传递给存储过程

2024-03-17

我必须将数组和字符串传递给存储过程并返回数据表

C# side:

public DataTable fetchRequested(string [] empID, string [] account, string [] refNo, string orgID, string Id, DateTime valueDate)
{
            string connetionString = null;
            OracleConnection con;
            OracleDataAdapter objAdapter = null;
            OracleCommand objComm = new OracleCommand();

            connetionString = @"Data Source= Payment_devlope; User ID=ORGPAYMENT;Password=OrgPayment";
            con = new OracleConnection (connetionString);

            try
            {
                con.Open();
                objComm.Connection = con;
                objComm.CommandType = CommandType.StoredProcedure;
                objComm.CommandText = "PKG_REPORTS.Requested_Payment";

                // Add and Set Procedure Parameters
                ////////////////////////////////////////////////////////////////////

                    objComm.Parameters.Add("p_empID", OracleDbType.NVarchar2, 100);
                    objComm.Parameters["p_empID"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;

                    if (empID.Length != 0)
                        objComm.Parameters["p_empID"].Value = empID;

                ////////////////////////////////////////////////////////////////////

                    objComm.Parameters.Add("p_account", OracleDbType.NVarchar2, 100);
                    objComm.Parameters["p_account"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;

                    if (account.Length != 0)
                        objComm.Parameters["p_account"].Value = account;

                ////////////////////////////////////////////////////////////////////

                objComm.Parameters.Add("p_refrence_number", OracleDbType.NVarchar2, 100);
                objComm.Parameters["p_refrence_number"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;

                if (refNo.Length != 0)
                    objComm.Parameters["p_refrence_number"].Value = refNo;

                ////////////////////////////////////////////////////////////////////

                objComm.Parameters.Add("p_Organization_Id", OracleDbType.Varchar2);
                objComm.Parameters["p_Organization_Id"].Direction = ParameterDirection.Input;

                if (!String.IsNullOrEmpty(orgID))
                {
                    objComm.Parameters["p_Organization_Id"].Value = orgID;
                }
                ////////////////////////////////////////////////////////////////////

                objComm.Parameters.Add("p_Id", OracleDbType.Varchar2);
                objComm.Parameters["p_Id"].Direction = ParameterDirection.Input;

                if (!String.IsNullOrEmpty(Id))
                {
                    objComm.Parameters["p_Id"].Value = Id;
                }
                ////////////////////////////////////////////////////////////////////

                objComm.Parameters.Add("p_Value_date", OracleDbType.Date);
                objComm.Parameters["p_Value_date"].Direction = ParameterDirection.Input;

                if (valueDate == null)
                {
                    objComm.Parameters["p_Value_date"].Value =valueDate;
                }

                ////////////////////////////////////////////////////////////////////
                objComm.Parameters.Add("cur_report_data", OracleDbType.RefCursor);
                objComm.Parameters["cur_report_data"].Direction = ParameterDirection.Output;
                ////////////////////////////////////////////////////////////////////

                objAdapter = new OracleDataAdapter();
                objAdapter.SelectCommand = objComm;

                // Filling Dataset with searched result
                DataSet ds = new DataSet();
                objAdapter.Fill(ds,"ReportData");

                return ds.Tables["ReportData"];
            }
            finally
            {
                if (objAdapter != null)
                {
                    objAdapter.Dispose();
                    objAdapter = null;
                }

                if (objComm != null)
                {
                    objComm.Dispose();
                    objComm = null;
                }

            }
}

PL/sql 端:

Procedure Requested_Payment (

    p_empID             in nvarchar_array := Null ,
    p_account           in nvarchar_array := Null,
    p_refrence_number   in nvarchar_array := Null,
    p_Organization_Id   in nvarchar2      := NULL,
    p_Id      in nvarchar2      := NULL,
    p_Value_date        in date           := NULL,
    cur_report_data     out Data_Table

)

is

BEGIN 
    open cur_report_data for
    SELECT  /*+ index(bp,B_PAYMENT_PK) */
            org.ORGANIZATION_CODE org_ID,
            bm.ID,
            bd.BENEFICIARY_organization_ID Employee_ID, 
            bd.BENEFICIARY_NAME Employee_Name,
            bp.REFERENCE_NUMBER Reference_No,
            bp.CREDIT_ACCOUNT ACC_NO,
            ct.ENGLISH_DESCRIPTION Reason,

            from
                Organization org inner join B_MASTER bm 
                on bm.organization_CODE = org.organization_CODE
            inner join B_DETAIL bd

                on bd.MASTER_SEQUENCE_ID = bm.MASTER_SEQUENCE_ID
            inner join B_payment bp
                on bp.MASTER_SEQUENCE_ID = bm.MASTER_SEQUENCE_ID
            inner join CODE_TABLE ct 
                on ct.code = BP.PAYMENT_STATUS

            where
               (p_Organization_Id is Null or org.organization_CODE = p_Organization_Id)
               AND (p_Id is Null OR bm.BATCH_NUMBER = p_Id)
               AND (p_Value_date is null or bm.Debit_VALUE_DATE between startofday(p_Value_date) and endofday(p_Value_date))
               AND (ct.GROUP_CODE = 4)
               AND (BD.DETAIL_SEQUENCE_ID = BP.DETAIL_ID)
               AND (p_empID is Null or bd.BENEFICIARY_organization_ID in (Select column_value FROM TABLE (p_empID)))
               AND (p_account is null or bp.CREDIT_ACCOUNT in (Select column_value FROM TABLE (p_account)))
               AND (p_refrence_number is null or bp.REFERENCE_NUMBER in (Select column_value FROM TABLE (p_account)))

;    

    end Requested_Payment ;

创建类型:

CREATE OR REPLACE TYPE ORGPAYROLL.NVARCHAR_ARRAY
AS TABLE OF VARCHAR2(100)

当数组之一为空时,我在 Visual Studio 中收到此错误:

OracleParameter.Value 无效

当我传递所有三个数组时,我收到此错误:

ORA-06550: 第 1 行,第 7 列:
PLS-00306:调用“REQUESTED_PAYMENT”时参数的数量或类型错误
ORA-06550: 第 1 行,第 7 列:
PLS-00306:调用“REQUESTED_PAYMENT”时参数的数量或类型错误
ORA-06550: 第 1 行,第 7 列:
PLS-00306:调用“REQUESTED_PAYMENT”时参数的数量或类型错误
ORA-06550: 第 1 行,第 7 列:
PL/SQL:语句被忽略


您的存储过程不应期望表类型,而应该期望associative array。您可以在存储过程中将其转换为您想要的类型。看这个链接 https://stackoverflow.com/questions/29605713/calling-an-oracle-procedure-with-a-pl-sql-collection-type-parameter-via-net更多细节

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数组传递给存储过程 的相关文章

随机推荐

  • 在反应中停止日期更新的最佳方法是什么?

    我正在映射对象数组并在卡片中显示它们的值 每个对象都有一个标题 评论和 datePosted 字段 datePosted 字段通过我制作的函数将其显示在卡片上为 2 小时前发布 或 2 分钟前发布 尽管每次状态发生变化 这都会更新 这在几天
  • 如何在 WooCommerce 中启用自定义产品类型的价格和库存

    我在 WooCommerce 应用程序中创建了自定义产品类型 function register variable bulk product type class WC Product Variable bulk extends WC Pr
  • jQuery 图像网格系统

    我有一个关于图像网格系统的问题 我创建了这个DEMO http codepen io shadowman86 pen YPpedQ来自 codepen io 在此演示中您可以看到 div class photo row div class
  • 创建位图时使用与密度无关的像素作为宽度和高度

    Bitmap createBitmap int width int height Bitmap Config config 方法只是说给它一个高度和一个宽度 没有指示这些是实际像素还是 dp 像素 我的问题 1 这些值是 dp 像素吗 2
  • 具有小数精度的格式数字字段?

    当然 我遗漏了一些非常明显的东西 我有一个精度为 2 的小数字段 但 Formtastic 仅以一位小数显示它 除非实际值有 2 位 我缺少什么 Model create table items force gt true do t t s
  • 你能让 std::shared_ptr 管理用 new T[] 分配的数组吗?

    你能做一个std shared ptr http en cppreference com w cpp memory shared ptr指向一个数组 例如 std shared ptr
  • npm:术语“npm”不被识别为 cmdlet、函数、脚本文件或可操作程序的名称

    当我检查节点 v时 一切正常并打印出来 但 npm 显示此错误 我怎样才能解决这个问题 请帮我 我搜索了很多时间并找到了解决方案 一旦安装nodejs gt 请重新启动笔记本电脑 然后设置路径 系统属性 gt 环境设置 gt C Progr
  • Git LFS 文件未推送到远程存储库

    我正在尝试使用 git LFS 将 xlsx 文件推送到远程存储库 我尝试了两种方法 使用 Sourcetree 点击菜单和使用终端服务器 两者都会产生相同的错误消息 我在 Bitbucket 中设置了一个远程存储库并设置了允许 LFS 选
  • WPF C# 类、文本框和参考,Easy(?)“当前上下文中不存在”

    我正在拔头发 我创建了一个类 employee cs 我最初在 Window1 xaml cs 上的 公共部分类 Window1 Window 中开发了这个类 当将其移动到单独的类时 我无法再引用文本框 组合框等 我该怎么办 给出的错误是
  • Python 交互式 Shell - 带有 print 的 SyntaxError [重复]

    这个问题在这里已经有答案了 我是Python新手 我在 Windows 2003 虚拟机上安装了 Python 推出Python Shell 输入以下代码 print Hello World 它立即向我吐出以下内容 语法错误 语法无效 以下
  • 哈希表 v 自平衡搜索树

    我很想知道使用自平衡树技术来存储项目比使用哈希表更重要的推理是什么 我发现哈希表无法维护插入顺序 但我始终可以在顶部使用链表来存储插入顺序序列 我发现对于少量的值 哈希函数会增加成本 但我总是可以将哈希函数与密钥一起保存以加快查找速度 我知
  • 检测何时将文本输入到文本区域并相应地更改它

    我有一个textarea用户可以在其中输入或粘贴其他人的电子邮件地址 并在按 提交 按钮后向他们发送邀请 每封电子邮件必须用逗号分隔 并且在提交表单之前有效 验证由jQuery 验证插件 http jqueryvalidation org
  • “在‘​​vue’中找不到导出‘默认’(作为‘Vue’导入)

    我是 VueJs 的初学者 这是我的第一个应用程序 import BootstrapVue from bootstrap vue import createApp from vue import App from App vue const
  • “函数”对象没有属性“tk”是什么意思?

    我目前正在开发一个程序 可以让您注册一个帐户 然后通过将详细信息写入 txt 文档并再次读取它们来再次登录 一切都工作正常 直到我添加以下内容 def login fh open usernamepassword txt r lines f
  • 在 Swift 中过滤具有多个条件和类型的对象数组

    我正在尝试在我的应用程序中进行一些复杂的过滤 但我不知道下一步该做什么 我的数据由一个字典数组组成 其中每个字典中的值可以是String Int or String let person1 String Any first name Joh
  • Onload 使输入大小适合文本长度

    我试图让 jQuery 测试 onLoad 输入框中文本的长度 并更改输入框的大小以适应 这是迄今为止我的代码尝试 emailSubject attr size this val length 我收到以下错误 this val 不是函数 我
  • Zend_Validate_Float 语言环境不适用于 hi_IN 语言环境

    在使用 hi IN 进行数字验证时 我面临以下问题 其中 Zend Locale Format isFloat 对于非单个数字和任何语言环境都可以正常工作 但不适用于单位数字和区域设置 hi IN 源代码 测试用例 foreach arra
  • 有没有办法识别 c/c++ 库的版本?

    例如 如何获取 usr lib libz a的版本 如果可以获取其他有用的信息 例如编译器 架构等 那就太好了 我想知道这一点的原因是 当我编译程序并与特定版本的 libz 链接时 gcc 总是说它忽略了我在命令行中提供的 libz gcc
  • 覆盖 require.js 中的 setTimeout

    我们在项目中使用 require js 我们需要重写设置超时时间在第 705 行 这是我们需要的代码以某种方式忽略 省略这个 setTimeout 根本 我的意思是运行它 问题是 如果我在更改版本时显式地在开源代码中更改它 代码将丢失 我应
  • 将数组传递给存储过程

    我必须将数组和字符串传递给存储过程并返回数据表 C side public DataTable fetchRequested string empID string account string refNo string orgID str