1
下面的t表的 id 列是 VARCHAR2类型,执行计划中列X自动通过TO_NUMBER函数转换为数值类型。
也就是说,当比较字段与数值的时候,数值会有优先级。
SQL> select * from t where id=1;
ID
------------------------------
1
执行计划
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 17 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("ID")=1)
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
5 recursive calls
0 db block gets
16 consistent gets
0 physical reads
0 redo size
520 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
当字符串和DATE类型比较时,DATE类型具有较高优先级。
呵呵 偷懒一下。

![]()
CHAR 遇到VARCHAR2 要转为VARCHAR2。
固定长度 (char) 或可变长度 (varchar) 字符数据类型。![]()
declare
v_c char(4) := 'ab ';
v_c2 varchar2(4) := 'ab';
begin
if v_c = v_c2 then
dbms_output.put_line('v_c=v_c2');
else
dbms_output.put_line('v_c<>v_c2');
end if;
end;
结果:v_c<>v_c2 ----?????
![]()
SQL> select * from t where id=1;
ID
------------------------------
1
执行计划
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 17 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("ID")=1)
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
5 recursive calls
0 db block gets
16 consistent gets
0 physical reads
0 redo size
520 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
当字符串和DATE类型比较时,DATE类型具有较高优先级。
呵呵 偷懒一下。
CHAR 遇到VARCHAR2 要转为VARCHAR2。
固定长度 (char) 或可变长度 (varchar) 字符数据类型。
declare
v_c char(4) := 'ab ';
v_c2 varchar2(4) := 'ab';
begin
if v_c = v_c2 then
dbms_output.put_line('v_c=v_c2');
else
dbms_output.put_line('v_c<>v_c2');
end if;
end;
结果:v_c<>v_c2 ----?????
2
SQL中VARCHAR2最大4000字节
PL/SQL中最大字节32767字节
测试:
declare
v_str varchar2(32767);
begin
v_str := lpad('a', '6000', 'a');
dbms_output.put_line(length(v_str));
v_str := lpad('b', '32767', 'b');
dbms_output.put_line(length(v_str));
v_str := lpad('c', '32768', 'c');
dbms_output.put_line(length(v_str));
end;
v_str varchar2(32767);
begin
v_str := lpad('a', '6000', 'a');
dbms_output.put_line(length(v_str));
v_str := lpad('b', '32767', 'b');
dbms_output.put_line(length(v_str));
v_str := lpad('c', '32768', 'c');
dbms_output.put_line(length(v_str));
end;