我正在尝试用C#更新Oracle的 VARRAY类型列
我正在尝试在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。