Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

nvl function changes dataType from char to varchar2

Aketi JyuuzouJun 21 2011 — edited Jun 21 2011
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0  Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create table fullJoinTest1(col1 char(14));

Table created.

SQL> create table fullJoinTest2(col1 char(14));

Table created.

SQL> insert all
  2  into fullJoinTest1 values('aaa')
  3  into fullJoinTest1 values('bbb')
  4  into fullJoinTest2 values('aaa')
  5  into fullJoinTest2 values('ccc')
  6  select 1 from dual;

4 rows created.

SQL> select nvl(a.col1,b.col1) as aaaa
  2    from fullJoinTest1 a full join fullJoinTest2 b
  3      on a.col1=b.col1
  4   where nvl(a.col1,b.col1)= 'ccc';

no rows selected

SQL> create table fullJoinTest3 as
  2  select nvl(a.col1,b.col1) as "WhatIsType?"
  3    from fullJoinTest1 a full join fullJoinTest2 b
  4      on a.col1=b.col1
  5   where nvl(a.col1,b.col1)= 'ccc';

Table created.

SQL> desc fullJoinTest3
 Name          Null?    Type
 ------------- -------- ------------
 WhatIsType?            VARCHAR2(14)

SQL> create table fullJoinTest4 as
  2  select case when a.col1 is not null then a.col1 else b.col1 end as "WhatIsType?"
  3    from fullJoinTest1 a full join fullJoinTest2 b
  4      on a.col1=b.col1;

Table created.

SQL> desc fullJoinTest4
 Name        Null?    Type
 ----------- -------- --------
 WhatIsType?          CHAR(14)
My question is why nvl function changes dataType from char to varchar2 ?
Even case expression does not change dataType.
I insist that this is a nvl functions bug is not it.
This post has been answered by Dom Brooks on Jun 21 2011
Jump to Answer

Comments

Dom Brooks
Answer
Documented behaviour:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/functions119.htm#SQLRF00684
If expr1 is character data, then Oracle Database converts expr2 to the data type of expr1 
before comparing them and returns VARCHAR2 in the character set of expr1.
Marked as Answer by Aketi Jyuuzou · Sep 27 2020
Sven W.
NVL is an overloaded function. You are ( and I tought the same) under the impression that there is a overloaded version for the CHAR datatype. However this seems not the case.

If we describe at sys.standard then we can see the following overloaded version (sorry for the bad formatting)
   
desc sys.standard

NVL (1) (FUNCTION)                                                                   <return value>                 PL/SQL BOOLEAN                                                            OUT       unknown  
NVL (1)                                                                              B1                             PL/SQL BOOLEAN                                                            IN        unknown  
NVL (1)                                                                              B2                             PL/SQL BOOLEAN                                                            IN        unknown  
NVL (10) (FUNCTION)                                                                  <return value>                 TIME                                                                      OUT       unknown  
NVL (10)                                                                             B1                             TIME                                                                      IN        unknown  
NVL (10)                                                                             B2                             TIME                                                                      IN        unknown  
NVL (11) (FUNCTION)                                                                  <return value>                 TIME WITH TIME ZONE                                                       OUT       unknown  
NVL (11)                                                                             B1                             TIME WITH TIME ZONE                                                       IN        unknown  
NVL (11)                                                                             B2                             TIME WITH TIME ZONE                                                       IN        unknown  
NVL (12) (FUNCTION)                                                                  <return value>                 TIMESTAMP                                                                 OUT       unknown  
NVL (12)                                                                             B1                             TIMESTAMP                                                                 IN        unknown  
NVL (12)                                                                             B2                             TIMESTAMP                                                                 IN        unknown  
NVL (13) (FUNCTION)                                                                  <return value>                 TIMESTAMP WITH TIME ZONE                                                  OUT       unknown  
NVL (13)                                                                             B1                             TIMESTAMP WITH TIME ZONE                                                  IN        unknown  
NVL (13)                                                                             B2                             TIMESTAMP WITH TIME ZONE                                                  IN        unknown  
NVL (14) (FUNCTION)                                                                  <return value>                 TIMESTAMP WITH LOCAL TIME ZONE                                            OUT       unknown  
NVL (14)                                                                             B1                             TIMESTAMP WITH LOCAL TIME ZONE                                            IN        unknown  
NVL (14)                                                                             B2                             TIMESTAMP WITH LOCAL TIME ZONE                                            IN        unknown  
NVL (15) (FUNCTION)                                                                  <return value>                 INTERVAL YEAR TO MONTH                                                    OUT       unknown  
NVL (15)                                                                             B1                             INTERVAL YEAR TO MONTH                                                    IN        unknown  
NVL (15)                                                                             B2                             INTERVAL YEAR TO MONTH                                                    IN        unknown  
NVL (16) (FUNCTION)                                                                  <return value>                 INTERVAL DAY TO SECOND                                                    OUT       unknown  
NVL (16)                                                                             B1                             INTERVAL DAY TO SECOND                                                    IN        unknown  
NVL (16)                                                                             B2                             INTERVAL DAY TO SECOND                                                    IN        unknown  
NVL (17) (FUNCTION)                                                                  <return value>                 CLOB                                                                      OUT       unknown  
NVL (17)                                                                             S1                             CLOB                                                                      IN        unknown  
NVL (17)                                                                             S2                             CLOB                                                                      IN        unknown  
NVL (18) (FUNCTION)                                                                  <return value>                 UNDEFINED (<OPAQUE_1>)                                                    OUT       unknown  
NVL (18)                                                                             B1                             UNDEFINED (<OPAQUE_1>)                                                    IN        unknown  
NVL (18)                                                                             B2                             UNDEFINED (<OPAQUE_1>)                                                    IN        unknown  
NVL (19) (FUNCTION)                                                                  <return value>                 BINARY_FLOAT                                                              OUT       unknown  
NVL (19)                                                                             F1                             BINARY_FLOAT                                                              IN        unknown  
NVL (19)                                                                             F2                             BINARY_FLOAT                                                              IN        unknown  
NVL (2) (FUNCTION)                                                                   <return value>                 VARCHAR2                                                                  OUT       unknown  
NVL (2)                                                                              S1                             VARCHAR2                                                                  IN        unknown  
NVL (2)                                                                              S2                             VARCHAR2                                                                  IN        unknown  
NVL (20) (FUNCTION)                                                                  <return value>                 BINARY_DOUBLE                                                             OUT       unknown  
NVL (20)                                                                             D1                             BINARY_DOUBLE                                                             IN        unknown  
NVL (20)                                                                             D2                             BINARY_DOUBLE                                                             IN        unknown  
NVL (21) (FUNCTION)                                                                  <return value>                 BINARY_INTEGER                                                            OUT       unknown  
NVL (21)                                                                             I1                             BINARY_INTEGER                                                            IN        unknown  
NVL (21)                                                                             I2                             BINARY_INTEGER                                                            IN        unknown  
NVL (3) (FUNCTION)                                                                   <return value>                 NUMBER                                                                    OUT       unknown  
NVL (3)                                                                              N1                             NUMBER                                                                    IN        unknown  
NVL (3)                                                                              N2                             NUMBER                                                                    IN        unknown  
NVL (4) (FUNCTION)                                                                   <return value>                 DATE                                                                      OUT       unknown  
NVL (4)                                                                              D1                             DATE                                                                      IN        unknown  
NVL (4)                                                                              D2                             DATE                                                                      IN        unknown  
NVL (5) (FUNCTION)                                                                   <return value>                 MLSLABEL                                                                  OUT       unknown  
NVL (5)                                                                              LABEL1                         MLSLABEL                                                                  IN        unknown  
NVL (5)                                                                              LABEL2                         MLSLABEL                                                                  IN        unknown  
NVL (6) (FUNCTION)                                                                   <return value>                 OBJECT (<ADT_1>)                                                          OUT       unknown  
NVL (6)                                                                              B1                             OBJECT (<ADT_1>)                                                          IN        unknown  
NVL (6)                                                                              B2                             OBJECT (<ADT_1>)                                                          IN        unknown  
NVL (7) (FUNCTION)                                                                   <return value>                 REF                                                                       OUT       unknown  
NVL (7)                                                                              B1                             REF                                                                       IN        unknown  
NVL (7)                                                                              B2                             REF                                                                       IN        unknown  
NVL (8) (FUNCTION)                                                                   <return value>                 TABLE (<COLLECTION_1>)                                                    OUT       unknown  
NVL (8)                                                                              B1                             TABLE (<COLLECTION_1>)                                                    IN        unknown  
NVL (8)                                                                              B2                             TABLE (<COLLECTION_1>)                                                    IN        unknown  
NVL (9) (FUNCTION)                                                                   <return value>                 REF CURSOR                                                                OUT       unknown  
NVL (9)                                                                              B1                             REF CURSOR                                                                IN        unknown  
NVL (9)                                                                              B2                             REF CURSOR                                                                IN        unknown 
As you can see there is a version for VARCHAR2, for CLOB, for number, etc. But none for CHAR.
Aketi Jyuuzou
Oh thanks.
I did not realize that sentence of Oracle ducument.
Aketi Jyuuzou
thanks for replay.

desc sys.standard is nice idea !!!
I done it.
FUNCTION NVL RETURNS BOOLEAN
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             BOOLEAN                 IN
 B2                             BOOLEAN                 IN
FUNCTION NVL RETURNS VARCHAR2
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 S1                             VARCHAR2                IN
 S2                             VARCHAR2                IN
FUNCTION NVL RETURNS NUMBER
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 N1                             NUMBER                  IN
 N2                             NUMBER                  IN
FUNCTION NVL RETURNS DATE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 D1                             DATE                    IN
 D2                             DATE                    IN
FUNCTION NVL RETURNS RAW MLSLABEL
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 LABEL1                         RAW MLSLABEL            IN
 LABEL2                         RAW MLSLABEL            IN
FUNCTION NVL RETURNS <ADT_1>
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             <ADT_1>                 IN
 B2                             <ADT_1>                 IN
FUNCTION NVL RETURNS REF OF STANDARD
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             REF OF STANDARD         IN
 B2                             REF OF STANDARD         IN
FUNCTION NVL RETURNS <COLLECTION_1>
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             <COLLECTION_1>          IN
 B2                             <COLLECTION_1>          IN
FUNCTION NVL RETURNS REF CURSOR
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             REF CURSOR              IN
 B2                             REF CURSOR              IN
FUNCTION NVL RETURNS TIME
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             TIME                    IN
 B2                             TIME                    IN
FUNCTION NVL RETURNS TIME WITH TIME ZONE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             TIME WITH TIME ZONE     IN
 B2                             TIME WITH TIME ZONE     IN
FUNCTION NVL RETURNS TIMESTAMP
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             TIMESTAMP               IN
 B2                             TIMESTAMP               IN
FUNCTION NVL RETURNS TIMESTAMP WITH TIME ZONE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             TIMESTAMP WITH TIME ZONE IN
 B2                             TIMESTAMP WITH TIME ZONE IN
FUNCTION NVL RETURNS TIMESTAMP WITH LOCAL TIME ZONE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             TIMESTAMP WITH LOCAL TIME ZONE IN
 B2                             TIMESTAMP WITH LOCAL TIME ZONE IN
FUNCTION NVL RETURNS INTERVAL YEAR TO MONTH
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             INTERVAL YEAR TO MONTH  IN
 B2                             INTERVAL YEAR TO MONTH  IN
FUNCTION NVL RETURNS INTERVAL DAY TO SECOND
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             INTERVAL DAY TO SECOND  IN
 B2                             INTERVAL DAY TO SECOND  IN
FUNCTION NVL RETURNS CLOB
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 S1                             CLOB                    IN
 S2                             CLOB                    IN
FUNCTION NVL RETURNS <OPAQUE_1>
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 B1                             <OPAQUE_1>              IN
 B2                             <OPAQUE_1>              IN
FUNCTION NVL RETURNS BINARY_FLOAT
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 F1                             BINARY_FLOAT            IN
 F2                             BINARY_FLOAT            IN
FUNCTION NVL RETURNS BINARY_DOUBLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 D1                             BINARY_DOUBLE           IN
 D2                             BINARY_DOUBLE           IN
FUNCTION NVL RETURNS BINARY_INTEGER
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 I1                             BINARY_INTEGER          IN
 I2                             BINARY_INTEGER          IN
1 - 4
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Jul 19 2011
Added on Jun 21 2011
4 comments
3,636 views