Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

DB2 to_nchar() functions modifies the behaviour of coulmn from NULL to NOT NULL

Posted on 2012-03-18
11
Medium Priority
?
638 Views
Last Modified: 2013-08-01
We are migrating the Sybase  database to DB2 database. As the data has DBCS characters, we are changing the char/varchar datatypes to nchar/nvarchar types. As part of this, the function TO_CHAR is changed to TO_NCHAR() assuming that the behaviour of both is same. But it is observed that while creating a table with TO_NCHAR() gives the column as NOT NULL whereas creating a table with TO_CHAR() gives the column as NULLABLE.

Source table:
 
CREATE TABLE tt_source
   (
   StartDate  TIMESTAMP NULL,
   enddate    TIMESTAMP NOT NULL
   )
 
Script used to create target table:
 
CREATE TABLE tt_target AS
   (
      SELECT
     
      TO_CHAR(Startdate,'mm/dd/yyyy') StartDate_char
     ,TO_CHAR(EndDate,'mm/dd/yyyy') EndDate_char
      ,TO_NCHAR(Startdate,'mm/dd/yyyy') StartDate_Nchar
     ,TO_NCHAR(EndDate,'mm/dd/yyyy') EndDate_Nchar
      FROM tt_source
   ) DEFINITION ONLY ;

The output is
Column      Type      Remarks
StartDate_char      Null      
EndDate_char      NOT NULL      
StartDate_nchar      NOT NULL      "This should have been NULLABLE,
                                                                  but to_nchar() changed to NOT NULL column"
EndDate_nchar      NOT NULL      


Is there a way to retain the nullability of the column while using TO_NCHAR() function.
0
Comment
Question by:vjmig
  • 3
  • 3
  • 2
  • +1
11 Comments
 
LVL 37

Expert Comment

by:momi_sabag
ID: 37737138
i don't understand
are you generating those statements or write them manually?
if you write them manually, why not just write a regular create table (instead of create as with the only definition clause)

did you try
cast (colname as nchar) ?
0
 

Author Comment

by:vjmig
ID: 37737279
We are not writing them manullally. We are migrating 2500 stored procedures using some third party tool that has converted to use TO_CHAR() to similate sybase behaviour. To handle the DBCS characters, we have  convetered to_char() to to_nchar().

My question is why to_char() and to_nchar() is behaving differently with respect to nulability.
0
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 37737477
Hi vj,

I believe that that behavior is a function of your conversion processor.  DB2 isn't creating the DDL to define the table.

Can you modify the table after it's created and before the data is loaded?  If so, you should be able to recreate the table to meet your needs, or ALTER any column definition that you need.


Good Luck,
Kent
0
Nothing ever in the clear!

This technical paper will help you implement VMware’s VM encryption as well as implement Veeam encryption which together will achieve the nothing ever in the clear goal. If a bad guy steals VMs, backups or traffic they get nothing.

 

Author Comment

by:vjmig
ID: 37737545
The tt_target table definetion is used to declare global temporary table. This way many temporary tables are declared in our Stored procedures.

CREATE TABLE tt_target AS
   (
      SELECT
     
      TO_CHAR(Startdate,'mm/dd/yyyy') StartDate_char
     ,TO_CHAR(EndDate,'mm/dd/yyyy') EndDate_char
      ,TO_NCHAR(Startdate,'mm/dd/yyyy') StartDate_Nchar
     ,TO_NCHAR(EndDate,'mm/dd/yyyy') EndDate_Nchar
      FROM tt_source
   ) DEFINITION ONLY ;
0
 
LVL 46

Assisted Solution

by:Kent Olsen
Kent Olsen earned 1000 total points
ID: 37737651
Sorry, I misunderstood your question.

But my question is still valid -- Can you modify the table after it's created and before the data is loaded?  If so, you should be able to recreate the table to meet your needs, or ALTER any column definition that you need.


Kent
0
 

Author Comment

by:vjmig
ID: 37737695
Yes, we can do that. but that will impact all the stored procedures and all of them around 4000 will need to be modified. I want to trying to avoid this if there is any easy way of doing this.
Also, I did not find any documention stating that to_char() and to_nchar() behave differently apart from character representaion.
0
 
LVL 46

Assisted Solution

by:Kent Olsen
Kent Olsen earned 1000 total points
ID: 37738699
Hi vj,

Yeah -- this came as something of a surprise to me, too.  :(

Do you have a need to store both an empty string and NULL in any of the effected columns?  Could you store an empty string in the NOT NULL column.  Then when the load is complete, ALTER the table to make the column nullable and update the table to set the blank items to NULL.


Just trying to help find a workaround,
Kent
0
 
LVL 8

Assisted Solution

by:mustaccio
mustaccio earned 500 total points
ID: 37739162
Looks like it may be a bug - consider opening a PMR with the IBM support.
0
 
LVL 37

Accepted Solution

by:
momi_sabag earned 500 total points
ID: 37740412
how about trying the following solution:
create your own function which is called to_nchar2 and in that function have an if that checks something that can never happen, and returns null, otherwise returns to_nchar
for example

create my_function(input nchar)
begin
if (input == 'ThisValueWillNeverBeInTheInput')
 then return cast(null as nchar)
else
 return to_nchar(input)
end

now, use some text editor and replace all the to_nchar with to_nchar2
0

Featured Post

NEW Veeam Agent for Microsoft Windows

Backup and recover physical and cloud-based servers and workstations, as well as endpoint devices that belong to remote users. Avoid downtime and data loss quickly and easily for Windows-based physical or public cloud-based workloads!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

November 2009 Recently, a question came up in the DB2 forum regarding the date format in DB2 UDB for AS/400.  Apparently in UDB LUW (Linux/Unix/Windows), the date format is a system-wide setting, and is not controlled at the session level.  I'm n…
Recursive SQL in UDB/LUW (it really isn't that hard to do) Recursive SQL is most often used to convert columns to rows or rows to columns.  A previous article described the process of converting rows to columns.  This article will build off of th…
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
When cloud platforms entered the scene, users and companies jumped on board to take advantage of the many benefits, like the ability to work and connect with company information from various locations. What many didn't foresee was the increased risk…

926 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question