Oracle 8.1.7
SQL> ed
已写入文件 afiedt.buf
1 declare
2 a varchar2(100);
3 begin
4 select rawtohex( 'aaaa ') into a from dual;
5 dbms_output.put_line(a);
6* end;
SQL> /
61616161 --结果正确!
PL/SQL 过程已成功完成。
SQL> ed
已写入文件 afiedt.buf
1 declare
2 a varchar2(100);
3 begin
4 a:=rawtohex( 'aaaa ');
5 dbms_output.put_line(a);
6* end;
SQL> /
AAAA --结果显然错误!
PL/SQL 过程已成功完成。
我估计是oracle内部类型转换的问题
这样可以
11:32:36 SQL> select to_char( rawtohex( 'aaaa ')) from dual;
TO_CHAR(
--------
61616161
但这样就不行了
11:32:22 SQL> declare
11:32:35 2 a varchar2(100);
11:32:35 3 begin
11:32:35 4 a:=to_char( rawtohex( 'aaaa '));
11:32:35 5 dbms_output.put_line(a);
11:32:35 6 end;
11:32:35 7 /
declare
*
ERROR 位于第1行:
ORA-06550: 第 4 行, 第 4 列:
PLS-00307: 有太多的 'TO_CHAR ' 说明与此次调用相匹配
ORA-06550: 第 4 行, 第 1 列:
PL/SQL: Statement ignored
RAWTOHEX is a SQL function, as opposed to a PL/SQL function, and must be used in a SQL statement. SQL has no concept of an assignment opperator, :=.
So change
l_strng := RAWTOHEX........
to
SELECT RAWTOHEX(p_string) INTO l_string FROM dual;
RAWTOHEX 函数确实是SQL函数,我经过了多次测试,得到的结果与你相同,按说rawtohex既然为sql函数,执行 a:=rawtohex( 'aaaa ')时就应该报错,至于oracle为什么不报错,我也说不清楚,也许真的有两个版本。总之你知道就行了。
似乎a:=rawtohex(x)大致相当于select rawtohex(hextoraw(x)) into a
HEXTORAW
语法: HEXTORAW(string)
功能: 将由string表示的二进制数值转换为一个RAW数值. String应该包含一个十六进制的数值. String中的每两个字符表示了结果RAW中的一个字节..HEXTORAW和RAWTOHEX为相反的两个函数.
使用位置: 过程性语言和SQL语句。
RAWTOHEX
语法: RAWTOHEX(rawvalue)
功能: 将RAW类数值rawvalue转换为一个相应的十六进制表示的字符串. rawvalue中的每个字节都被转换为一个双字节的字符串. RAWTOHEX和HEXTORAW是两个相反的函数.
使用位置: 过程性语言和SQL语句。