Re: Strange effects of Cast
From: Charles Hooper <hooperc2000_at_yahoo.com>
Date: Mon, 16 Feb 2009 18:22:42 -0800 (PST)
Message-ID: <96124c54-3f3b-4e0e-a987-6f8c43845ab6_at_m4g2000vbp.googlegroups.com>
On Feb 16, 3:45 pm, Maxim Demenko <mdeme..._at_gmail.com> wrote:
> It seems to be related to Bug 7154415.
> On 11.1.0.7 results are like what you are expecting to be:
>
> SQL> select * from v$version;
>
> BANNER
> --------------------------------------------------------------------------------
> Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
> PL/SQL Release 11.1.0.7.0 - Production
> CORE 11.1.0.7.0 Production
> TNS for Linux: Version 11.1.0.7.0 - Production
> NLSRTL Version 11.1.0.7.0 - Production
>
> SQL> Select
> 2 Cast(NUM1 As Varchar2(7)) As COL1,
> 3 Cast(NUM1 As Varchar2(3)) As COL2,
> 4 Cast(NUM1 As Varchar2(9)) As COL3,
> 5 NUM1 As COL4
> 6 From
> 7 (
> 8 Select
> 9 '12345678901234567890' As NUM1
> 10 From
> 11 Dual
> 12 )
> 13 /
>
> COL1 COL COL3 COL4
> ------- --- --------- --------------------
> 1234567 123 123456789 12345678901234567890
>
> Despite that, i agree with Charles, the proper tool for truncation of
> strings is the SUBSTR functions family, if you misuse the CAST for that
> purpose, you are buing side effects, such as implicit conversions etc.
>
> Best regards
>
> Maxim
(Select
:NUM1 As NUM1
From
Dual);
10.2.0.4.0
Date: Mon, 16 Feb 2009 18:22:42 -0800 (PST)
Message-ID: <96124c54-3f3b-4e0e-a987-6f8c43845ab6_at_m4g2000vbp.googlegroups.com>
On Feb 16, 3:45 pm, Maxim Demenko <mdeme..._at_gmail.com> wrote:
> It seems to be related to Bug 7154415.
> On 11.1.0.7 results are like what you are expecting to be:
>
> SQL> select * from v$version;
>
> BANNER
> --------------------------------------------------------------------------------
> Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
> PL/SQL Release 11.1.0.7.0 - Production
> CORE 11.1.0.7.0 Production
> TNS for Linux: Version 11.1.0.7.0 - Production
> NLSRTL Version 11.1.0.7.0 - Production
>
> SQL> Select
> 2 Cast(NUM1 As Varchar2(7)) As COL1,
> 3 Cast(NUM1 As Varchar2(3)) As COL2,
> 4 Cast(NUM1 As Varchar2(9)) As COL3,
> 5 NUM1 As COL4
> 6 From
> 7 (
> 8 Select
> 9 '12345678901234567890' As NUM1
> 10 From
> 11 Dual
> 12 )
> 13 /
>
> COL1 COL COL3 COL4
> ------- --- --------- --------------------
> 1234567 123 123456789 12345678901234567890
>
> Despite that, i agree with Charles, the proper tool for truncation of
> strings is the SUBSTR functions family, if you misuse the CAST for that
> purpose, you are buing side effects, such as implicit conversions etc.
>
> Best regards
>
> Maxim
Maxim,
Thanks for the follow up with the more recent version of Oracle.
I think that it has been stated a couple times, in various places,
that using bind variables is generally a good idea. Let's see if
Oracle agrees (executed in SQL*Plus):
VARIABLE NUM1 VARCHAR2(20)
EXEC :NUM1 := '12345678901234567890'
COLUMN COL4 FORMAT 99999999999999999999
SELECT
SUBSTR(Cast(NUM1 As Varchar2(20)),1,7) As COL1, SUBSTR(Cast(NUM1 As Varchar2(20)),1,3) As COL2, SUBSTR(Cast(NUM1 As Varchar2(20)),1,9) As COL3, NUM1 As COL4From
(Select
:NUM1 As NUM1
From
Dual);
COL1 COL COL3 COL4
------- --- --------- --------------------1234567 123 123456789 12345678901234567890
SELECT
VERSION
FROM
V$INSTANCE;
VERSION
10.2.0.4.0
The solution, or at least a work around, is to try submitting the value in a bind variable. A better idea would be to use the SUBSTR function.
Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc.
Received on Mon Feb 16 2009 - 20:22:42 CST