看Tom写的<使用校验和的乐观锁定>过程中, 对文章举例的应用进行了试验.
begin
for x in (select a, age
from test
where a=1)
loop
dbms_output.put_line('a:'||x.a);
dbms_output.put_line('age:'||x.age);
dbms_output.put_line('Hash:'|| DBMS_CRYPTO.hash(utl_raw.cast_to_raw(x.a), DBMS_CRYPTO.hash_sh1));
end loop;
end;
/
试验帐号具有DBA权限, 在在编译时会报ORA-00904: : 标识符无效,该错误时针对DBMS_CRYPTO包的,
执行:
SQL> SELECT * FROM user_tab_privs WHERE table_name = 'DBMS_CRYPTO';
未选定行.
当前用户无权限执行该包, 需要切换用户进行授权:
SQL> grant execute on DBMS_CRYPTO to seasail;
授权成功。
再次执行:
SQL> SELECT * FROM user_tab_privs WHERE table_name = 'DBMS_CRYPTO';
GRANTEE OWNER TABLE_NAME GRANTO RPRIVILEGE GRA HIE
----------- ---------- ------------- ------- ----------- --- ----
SEASAIL SYS DBMS_CRYPTO SYS EXECUTE NO NO
SQL> select dbms_crypto.hash(utl_raw.cast_to_raw(10), dbms_crypto.hash_sh1)
2 from dual;
select dbms_crypto.hash(utl_raw.cast_to_raw(10), dbms_crypto.hash_sh1)
*
第 1 行出现错误:
ORA-06553: PLS-221: 'HASH_SH1' 不是过程或尚未定义
从网上搜索了一把, 找到了一个德文的pdf, 但看不懂, 此外还有这个网址:
http://www.irclog.org/freenode/oracle/2006-08-01/page1.html
根据上面的信息把dbms_crypto.hash_sh1该为3, 则能执行成功.
SQL> select dbms_crypto.hash(utl_raw.cast_to_raw(10), 3) hash_value
2 from dual;
HASH_VALUE
------------------------------------------------------------------------
B1D5781111D84F7B3FE45A0852E59758CD7A87E5