Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL试图在一列中散列25列_Sql_Oracle_Hash - Fatal编程技术网

Oracle SQL试图在一列中散列25列

Oracle SQL试图在一列中散列25列,sql,oracle,hash,Sql,Oracle,Hash,所以,当我试图使用ORA_散列函数散列25列时,我得到了一个错误:参数太多。 有没有什么方法可以快速散列所有25列,因为我们有大约6000万行,并且没有更新日期:( 将连接与一些特殊字符串一起使用作为分隔符,例如此处的chr(10),假设此特许不出现在您的数据中 col1||chr(10)||col1||.... 小心数字和数据列 或者在字符列中显式地转换它们,例如 ...||to_char(col_date,'yyyy-mm-dd hh24:mi:ss')||... 或临时替代会话设置

所以,当我试图使用ORA_散列函数散列25列时,我得到了一个错误:参数太多。 有没有什么方法可以快速散列所有25列,因为我们有大约6000万行,并且没有更新日期:(


将连接与一些特殊字符串一起使用作为分隔符,例如此处的chr(10),假设此特许不出现在您的数据中

 col1||chr(10)||col1||....
小心数字和数据列

或者在字符列中显式地转换它们,例如

...||to_char(col_date,'yyyy-mm-dd hh24:mi:ss')||... 
或临时替代会话设置以具有常量值

 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.']';
 ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';
NLS设置的问题是,当它们更改时,您将执行到字符串的默认转换-您将得到不同的哈希代码

也注意到,ORAYHash可以导致重复,例如考虑代码> MD5< /代码>哈希代码来识别表数据的变化。


最后一点注意:Oracle有一个(不为人所知)函数,该函数可能是您想要的函数,也可能不是您想要的函数。

使用带有某些特殊字符串的连接作为分隔符,例如,此处的chr(10)假设此特许权未出现在您的数据中

 col1||chr(10)||col1||....
小心数字和数据列

或者在字符列中显式地转换它们,例如

...||to_char(col_date,'yyyy-mm-dd hh24:mi:ss')||... 
或临时替代会话设置以具有常量值

 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.']';
 ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';
NLS设置的问题是,当它们更改时,您将执行到字符串的默认转换-您将得到不同的哈希代码

也注意到,ORAYHash可以导致重复,例如考虑代码> MD5< /代码>哈希代码来识别表数据的变化。


最后一点注意:Oracle有一个(不知名)函数,它可能是您想要的,也可能不是您想要的。

您的最终目标肯定不是获取哈希?哈希的用途是什么?它可能不是实现目标的正确方法

其次,
ORA_HASH
是一种弱的32位散列,大约每25000行就会产生一次散列冲突!我写了一篇关于这一点的博客文章,请参阅:

第三,从版本12c开始,有一个
标准_HASH
函数,它的性能似乎相当好,最高可达512位!(不是我在编辑此答案之前所说的字节…)

最后,将多个内容散列在一起的正确方法是“散列链接”,而不是将值串联起来。
ORA_hash
似乎支持使用第三个参数进行散列链接(或类似效果):

ora_hash(column1, 4294967295, ora_hash(column2))

使用
STANDARD\u HASH
,我会首先在每一列上单独使用它,然后使用
UTL\u RAW.CONCAT
连接结果,然后在连接的结果上使用
STANDARD\u HASH
,或者只使用连接的值,就好像它是一个大的散列一样。

你的最终目标肯定不是得到散列吗?h是什么灰烬?这很可能不是实现目标的正确方式

其次,
ORA_HASH
是一种弱的32位散列,大约每25000行就会产生一次散列冲突!我写了一篇关于这一点的博客文章,请参阅:

第三,从版本12c开始,有一个
标准_HASH
函数,它的性能似乎相当好,最高可达512位!(不是我在编辑此答案之前所说的字节…)

最后,将多个内容散列在一起的正确方法是“散列链接”,而不是将值串联起来。
ORA_hash
似乎支持使用第三个参数进行散列链接(或类似效果):

ora_hash(column1, 4294967295, ora_hash(column2))

使用
STANDARD\u HASH
,我会首先在每一列上单独使用它,然后使用
UTL\u RAW.CONCAT
连接结果,然后在连接的结果上使用
STANDARD\u HASH
,或者只使用连接的值,就好像它是一个大散列一样。

散列是单个变量的函数。您如何建议to从25列中获取一个值?如果它们都是VARCHAR2,也许您可以将它们全部连接在一起(尽管会出现一些不希望出现的效果:“a”| |“bc”=“ab”| |“c”,因此即使元组不是,散列也会相同)但是ORA_HASH不能与CLOB一起使用,因此如果连接的结果太长,您将无法对结果使用ORA_HASH。那么…为什么要尝试这样做?您确定这是最好的方法吗?您的最终目标是什么?HASH是一个单变量函数。您建议如何从25列中获取单个值?如果它们都是VARCHAR2也许您可以将它们连接在一起(尽管会出现一些不希望出现的效果:“a”| |“bc”=“ab”| |“c”,因此即使元组不存在,哈希也会相同)但是ORA_HASH不能与CLOB一起使用,所以如果连接的结果太长,你就不能在结果上使用ORA_HASH。那么…为什么要这样做?你确定这是最好的方法吗?你的最终目标是什么?DBMS_SQLHASH在12.2、18c和19c的文档中没有提到。看起来它好像是从裂缝中掉出来的。太d、 可能会很有趣。12.2、18c和19c的文档中没有提到DBMS_SQLHASH。看起来它是从裂缝中掉出来的。太糟糕了,可能会很有趣。