我对oracle的基本运行原理还不懂,请教一下大家
1、oracle 的隐式转换是在哪个阶段执行?
我指的是 SQL解析、传到服务器、SQL引擎执行,这三个阶段中的哪个?
或者还是在别的阶段?
2、oracle自带的函数,在哪个阶段进行计算?

解决方案 »

  1.   

    对于1:
    The following rules govern the direction in which Oracle makes implicit datatype conversions:1) During INSERT and UPDATE operations, Oracle converts the value to the datatype of the affected column.
    对于INSERT和UPDATE操作,oracle会把插入值或者更新值隐式转换为字段的数据类型。如
    假如id列的数据类型为number
    update t set id='1'; -> 相当于 update t set id=to_number('1');
    insert into t(id) values('1') -> insert into t values(to_number('1'));2) During SELECT FROM operations, Oracle converts the data from the column to the type of the target variable.
    对于SELECT语句,oracle会把字段的数据类型隐式转换为变量的数据类型。如
    假设id列的数据类型为varchar2
    select * from t where id=1; -> select * from t where to_number(id)=1;
    但如果id列的数据类型为number,则
    select * from t where id='1'; -> select * from t where id=to_number('1');(参考下文)3) When comparing a character value with a NUMBER value, Oracle converts the character data to NUMBER.
    当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型。如
    假设id列的数据类型为number
    select * from t where id='1'; -> select * from t where id=to_number('1');4) When comparing a character value with a DATE value, Oracle converts the character data to DATE.
    当比较字符型和日期型的数据时,oracle会把字符型转换为日期型。如
    假设create_date为字符型,
    select * from t where create_date>sysdate; -> select * from t where to_date(create_date)>sysdate;(注意,此时session的nls_date_format需要与字符串格式相符)
    假设create_date为date型,
    select * from t where create_date>'2006-11-11 11:11:11'; -> select * from t where create_date>to_date('2006-11-11 11:11:11'); (注意,此时session的nls_date_format需要与字符串格式相符)5) When you use a SQL function or operator with an argument of a datatype other than the one it accepts,
    Oracle converts the argument to the accepted datatype.
    如果调用函数或过程等时,如果输入参数的数据类型与函数或者过程定义的参数数据类型不一直,则oracle会把输入参数的数据类型转换为函数或者过程定义的数据类型。如
    假设过程如下定义
    p(p_1 number)
    exec p('1'); -> exec p(to_number('1'));6) When making assignments, Oracle converts the value on the right side of the equal sign (=) to the datatype of the target of the assignment on the left side.
    赋值时,oracle会把等号右边的数据类型转换为左边的数据类型。如
    var a number
    a:='1'; - > a:=to_number('1');
    7) During concatenation operations, Oracle converts from noncharacter datatypes to CHAR or NCHAR.
    用连接操作符(||)时,oracle会把非字符类型的数据转换为字符类型。
    select 1||'2' from dual; -> select to_char(1)||'2' from dual;8) During arithmetic operations on and comparisons between character and noncharacter datatypes,
    Oracle converts from any character datatype to a number, date, or rowid, as appropriate.
    In arithmetic operations between CHAR/VARCHAR2 and NCHAR/NVARCHAR2, Oracle converts to a number.
    如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算,则oracle会将字符类型的数据转换为合适的数据类型,这些数据类型可能是number、date、rowid等。
    如果CHAR/VARCHAR2 和NCHAR/NVARCHAR2之间作算术运算,则oracle会将她们都转换为number类型的数据再做比较。9) Comparisons between CHAR/VARCHAR2 and NCHAR/NVARCHAR2 types may entail different character sets.
    The default direction of conversion in such cases is from the database character set to the national character set.比较CHAR/VARCHAR2 和NCHAR/NVARCHAR2时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集。
    简单总结:
    比较时,一般是字符型转换为数值型,字符型转换为日期型
    算术运算时,一般把字符型转换为数值型,字符型转换为日期型
    连接时(||),一般是把数值型转换为字符型,日期型转换为字符型
    赋值、调用函数时,以定义的变量类型为准。综上所述,你看到了,转换一般都是在对SQl进行解析的时候进行的。2、
    第二咱不知道,不过按照一般情况来说,也是在对SQl进行解析之前进行计算的说。
      

  2.   

    SQL解析阶段,解析了以后然后生成SQL执行计划