我正在尝试用C#更新Oracle的 VARRAY类型列

编程语言 2026-07-09

我正在尝试在Oracle表中更新一个 VARRAY 列,使用 Oracle.ManagedDataAccess.Client 在C#中

我有以下代码:

OracleCommand cmd2 = new OracleCommand(
        "update mytable set hcodes = :hcodes where ich = 'xxx'", ora);            
cmd2.Parameters.Add(new OracleParameter{ParameterName = ":hcodes",UdtTypeName = "HCODE_ARRAY"});            
cmd2.Prepare();            
cmd2.Parameters[":hcodes"].Value = new string[] { "ABCD", "DEFG" };
cmd2.ExecuteNonQuery();

当我执行这段代码时,我得到:

Oracle.ManagedDataAccess.Client.OracleException: 'ORA-00932: inconsistent datatypes: expected HCODE_ARRAY got CHAR'

HCODE_ARRAY 被定义为:

CREATE OR REPLACE TYPE HCODE_ARRAY                                          
AS
   VARRAY(5) of varchar2(4); 
/

编辑:5/8这段非参数化的代码可以工作:

OracleCommand cmd2 = new OracleCommand(
"update mytable set hcodes = scrpt_app.HCODE_ARRAY('E123','E456') where ich = 'xxx'", ora);

于是我尝试了这个:

OracleCommand cmd2 = new OracleCommand(
                "update mytable set hcodes =    
         HCODE_ARRAY(:hcodes) where ich = 'xxx'", ora);
            cmd2.Parameters.Add(":hcodes", OracleDbType.Varchar2);
            cmd2.Parameters[":hcodes"].Value = "'E123','E456','E789'";
            cmd2.ExecuteNonQuery();

但它会失败,显示 'ORA-22814: attribute or element value is larger than specified in type'

解决方案

我的解决办法是这样的:
我创建了一个PL/SQL函数FN_HCODES_FROM_STRING

然后在我的UPDATE语句中调用它。

[尽管这解决了我的问题,我也希望有一种不需要该函数的解决方案]

CREATE OR REPLACE FUNCTION FN_HCODES_FROM_STRING(hcodes_string in VARCHAR2) RETURN HCODE_ARRAY IS

    v_result   HCODE_ARRAY := HCODE_ARRAY(); -- initialize empty varray
    v_index   PLS_INTEGER := 1;
    v_item    VARCHAR2(4);
BEGIN

    LOOP
        -- Extract each value using REGEXP_SUBSTR
        v_item := REGEXP_SUBSTR(hcodes_string, '[^,]+', 1, v_index);
        EXIT WHEN v_item IS NULL;

        -- Extend and add to VARRAY
        v_result.EXTEND;
        v_result(v_result.COUNT) := TRIM(v_item);

        v_index := v_index + 1;
    END LOOP;
RETURN v_result;

END FN_HCODES_FROM_STRING;
/

OracleCommand cmd2 = new OracleCommand(
                "update mytable set hcodes = (SELECT FN_HCODES_FROM_STRING(:hcodes) FROM DUAL) where ich = 'xxx'", ora);
            cmd2.Parameters.Add(":hcodes", OracleDbType.Varchar2);
            cmd2.Parameters[":hcodes"].Value = "E123,E345,E678";
            cmd2.ExecuteNonQuery();
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章