将VARCHAR2投射到LONG,RAW,CLOB并找到HASH md5

问题描述 投票:0回答:1

存在具有字段(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太小)时,会有例外。

如何在这种选择中将其强制转换为其他类型,例如clobto_clob(str1 || str2)不起作用。

[standart_hash不适用于clob,long,raw

解决铸造问题后可以用来解决这个问题?

sql oracle plsql hash
1个回答
3
投票

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.

如您所见,我能够毫无问题地运行您的示例。

© www.soinside.com 2019 - 2024. All rights reserved.