存在具有字段(str1 VARCHAR2(4000 CHAR),str2 VARCHAR2(4000 CHAR))
的表A
存在具有字段(str1 VARCHAR2(4000 CHAR),str2 VARCHAR2(4000 CHAR),hash_code NUMBER)
的表B
begin
insert into B(str1,str2,hash_code)
select str1, str2, standart_hash(str1 ||str2,'MD5') as hash_code from A;
commit;
end;
因此,当length(str1||str2)
大于4000(varchar2太小)时,会有例外。
如何在这种选择中将其强制转换为其他类型,例如clob
? to_clob(str1 || str2)
不起作用。
[standart_hash
不适用于clob,long,raw
。
解决铸造问题后可以用来解决这个问题?
varchar2数据类型实际上在PL / SQL中的最大长度为32K,而standard_hash对输入的大小没有限制。还请注意,standard_hash返回RAW数据类型,而不是NUMBER,因为您在示例中定义了hash_code列。
SQL> desc A
Name Null? Type
----------------------------------------- -------- ----------------------------
STR1 VARCHAR2(4000)
STR2 VARCHAR2(4000)
SQL> desc B
Name Null? Type
----------------------------------------- -------- ----------------------------
STR1 VARCHAR2(4000)
STR2 VARCHAR2(4000)
HASH_VALUE RAW(50)
SQL> select length(str1), length(str2) from A;
LENGTH(STR1) LENGTH(STR2)
------------ ------------
4000 4000
3 3
SQL> insert into B (str1, str2, hash_value) select str1, str2, standard_hash(str1||str2,'MD5') as hash_value from A;
2 rows created.
SQL> begin
2 insert into B (str1, str2, hash_value) select str1, str2, standard_hash(str1||str2,'MD5') as hash_value from A;
3 commit;
4 end;
5 /
PL/SQL procedure successfully completed.
如您所见,我能够毫无问题地运行您的示例。