Oracle中RAW数据类型插入/更新时仅存入一半值的问题求助
问题根因
你在拼接动态SQL时,直接将RAW类型变量和字符串拼接,触发了PL/SQL的隐式类型转换,且未显式指定RAW到SQL文本的转换规则,导致值被截断:
- RAW类型变量和字符串拼接时,PL/SQL会隐式调用
RAWTOHEX()将RAW值转换为十六进制字符串(16字节RAW对应32位十六进制字符串) - 你直接将该字符串用单引号包裹后写入INSERT/UPDATE语句,Oracle执行SQL时会将单引号内的字符串按字符ASCII码隐式转换为RAW,而非按十六进制规则转换,导致转换后的RAW长度翻倍,被目标字段截断为前1/2长度
修复方案
修改RAW类型字段的SQL拼接逻辑,将转换后的十六进制字符串用HEXTORAW()函数包裹,显式告诉Oracle按十六进制规则转换为RAW值:
原拼接逻辑:
v_insert_str := v_insert_str || '''' || v_raw || '''' || ', '; -- UPDATE、WHERE条件拼接逻辑同理
修改后:
v_insert_str := v_insert_str || 'HEXTORAW(''' || v_raw || ''')' || ', '; -- UPDATE语句同步修改: v_update_str := v_update_str || v_desc_tab ( i ).col_name || ' = HEXTORAW(''' || v_raw || ''')' || ', '; -- WHERE条件同步修改: v_update_where_str := v_update_where_str || v_desc_tab ( i ).col_name || ' = HEXTORAW(''' || v_raw || ''')' || ' and ';
可选优化建议
如果需要兼容更长的RAW类型(比如RAW(2000)),可以避免动态SQL拼接的方式,改用DBMS_SQL.BIND_VARIABLE绑定变量的方式传入RAW值,既可以避免类型转换问题,也能提升SQL执行效率,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者mona shiri
相关产品推荐
相关产品推荐

