| Author | 
		  Message
		 | 
		
		  | cong_ren | 
		  
		    
			  
				 Posted: Wed Jan 25, 2012 3:07 pm    Post subject: Cast Exception when trying to convert BLOB into CHARACTER | 
				     | 
			   
			 
		   | 
		
		
		   Newbie
 
 Joined: 25 Jan 2012 Posts: 2
  
  | 
		  
		    
			  
				Hi,
 
 
I am getting the following cast exception when trying to convert a BLOB into a CHARACTER.  It is unable to convert some of the characters inside the BLOB to the CHARACTER type.
 
 
Here is the ESQL code snippet of the casting operation:
 
SET OutputRoot.JMSTransport.Transport_Folders.Header_Values.JMSCorrelationID = CAST(InputLocalEnvironment.Destination.SOAP.Reply.ReplyIdentifier AS CHARACTER CCSID InputRoot.Properties.CodedCharSetId);
 
 
Question:
 
1. Is there anything wrong with the casting statement above?
 
2. If so, any recommendations as to how can I resolve this issue?
 
 
The reason I am doing such casting is to propagate the SOAPReplyID from the request flow to the response flow using the JMSCorrelID as a delivery vehicle.
 
 
Request: SOAP -> JMS
 
Response: JMS -> SOAP
 
 
 
+===============
 
Details of the Exception
 
+===============
 
   
 
   ExceptionList 
 
    RecoverableException 
 
      File:CHARACTER:F:\build\S700_P\src\DataFlowEngine\ImbDataFlowNode.c 
 
   pp 
 
      Line:INTEGER:1073 
 
      Function:CHARACTER:ImbDataFlowNode::createExceptionList 
 
      Type:CHARACTER:ComIbmComputeNode 
 
      Name:CHARACTER:OrderServices#FCMComposite_1_24 
 
      Label:CHARACTER:OrderServices.SetSOAPReplyIdToJMSCorrelId 
 
      Catalog:CHARACTER:BIPmsgs 
 
      Severity:INTEGER:3 
 
      Number:INTEGER:2230 
 
      Text:CHARACTER:Node throwing exception 
 
      RecoverableException 
 
        File:CHARACTER:F:\build\S700_P\src\DataFlowEngine\ImbRdl\ImbRdlSt 
 
   atementGroup.cpp 
 
        Line:INTEGER:641 
 
        Function:CHARACTER:SqlStatementGroup::execute 
 
        Type:CHARACTER:ComIbmComputeNode 
 
        Name:CHARACTER:OrderServices#FCMComposite_1_24 
 
        Label:CHARACTER:OrderServices.SetSOAPReplyIdToJMSCorrelId 
 
        Catalog:CHARACTER:BIPmsgs 
 
        Severity:INTEGER:3 
 
        Number:INTEGER:2488 
 
        Text:CHARACTER:Error detected, rethrowing 
 
        Insert 
 
          Type:INTEGER:5 
 
          Text:CHARACTER:.SSFSAPIsUtil_SetSOAPReplyIdToJMSCorrelId.Main 
 
        Insert 
 
          Type:INTEGER:5 
 
          Text:CHARACTER:4.3 
 
        Insert 
 
          Type:INTEGER:5 
 
          Text:CHARACTER:SET 
 
   OutputRoot.JMSTransport.Transport_Folders.Header_Values.JMSCorrelation 
 
   ID = CAST(InputLocalEnvironment.Destination.SOAP.Reply.ReplyIdentifier 
 
   AS CHARACTER CCSID InputRoot.Properties.CodedCharSetId); 
 
        RecoverableException 
 
          File:CHARACTER:F:\build\S700_P\src\DataFlowEngine\ImbRdl\ImbRdl 
 
   TypeCast.cpp 
 
          Line:INTEGER:260 
 
          Function:CHARACTER:SqlTypeCast::evaluate 
 
          Type:CHARACTER: 
 
          Name:CHARACTER: 
 
          Label:CHARACTER: 
 
          Catalog:CHARACTER:BIPmsgs 
 
          Severity:INTEGER:3 
 
          Number:INTEGER:2521 
 
          Text:CHARACTER:Error while casting 
 
          Insert 
 
            Type:INTEGER:5 
 
            Text:CHARACTER:.SSFSAPIsUtil_SetSOAPReplyIdToJMSCorrelId.Main 
 
          Insert 
 
            Type:INTEGER:5 
 
            Text:CHARACTER:4.82 
 
          Insert 
 
            Type:INTEGER:5 
 
            Text:CHARACTER:X'534f4150000000000c000000000000008c1600000000 
 
   0000' 
 
          Insert 
 
            Type:INTEGER:5 
 
            Text:CHARACTER:CHARACTER 
 
          RecoverableException 
 
            File:CHARACTER:F:\build\S700_P\src\CommonServices\ImbConverte 
 
   r.cpp 
 
            Line:INTEGER:504 
 
            Function:CHARACTER:ImbConverterCPP::internalToUnicode 
 
            Type:CHARACTER: 
 
            Name:CHARACTER: 
 
            Label:CHARACTER: 
 
            Catalog:CHARACTER:BIPmsgs 
 
            Severity:INTEGER:3 
 
            Number:INTEGER:2135 
 
            Text:CHARACTER:Unconvertable character 
 
            Insert 
 
              Type:INTEGER:5 
 
              Text:CHARACTER:8c 
 
            Insert 
 
              Type:INTEGER:5 
 
              Text:CHARACTER:534f4150000000000c000000000000008c1600000000 
 
   0000 
 
            Insert 
 
              Type:INTEGER:2 
 
              Text:CHARACTER:1208 
 
 
 
   | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | rekarm01 | 
		  
		    
			  
				 Posted: Wed Jan 25, 2012 5:03 pm    Post subject: Re: Cast Exception when trying to convert BLOB into CHARACTE | 
				     | 
			   
			 
		   | 
		
		
		   Grand Master
 
 Joined: 25 Jun 2008 Posts: 1415
  
  | 
		  
		    
			  
				This BLOB is not a valid UTF-8 byte sequence, because the byte X'8c' is not a valid UTF-8 start byte:
 
   
	| Quote: | 
   
  
	| X'53 4f 41 50 00 00 00 00 0c 00 00 00 00 00 00 00 8c 16 00 00 00 00 00 00' | 
   
 
 
Not every random byte sequence can represent a meaningful character string, (particularly those meant to represent correlation identifiers).  Perhaps it's better to leave it in HEX when CASTing to CHARACTER, by removing the CCSID parameter:
 
 
   
	| Code: | 
   
  
	SET OutputRoot.JMSTransport.Transport_Folders.Header_Values.JMSCorrelationID
 
    = CAST(InputLocalEnvironment.Destination.SOAP.Reply.ReplyIdentifier AS CHARACTER); | 
   
 
 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | fjb_saper | 
		  
		    
			  
				 Posted: Wed Jan 25, 2012 9:06 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand High Poobah
 
 Joined: 18 Nov 2003 Posts: 20768 Location: LI,NY 
  | 
		  
		    
			  
				Have you even verified if the byte sizes are compatible?
 
 
A BLOB cannot always be CASTed to a CHAR. How do you transform x'00000000' into a char, in any CCSID?
 
 
Think it over again. The design may not fit.
 
Have fun   _________________ MQ & Broker admin | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | kimbert | 
		  
		    
			  
				 Posted: Thu Jan 26, 2012 4:54 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Jedi Council
 
 Joined: 29 Jul 2003 Posts: 5543 Location: Southampton 
  | 
		  
		    
			  
				
   
	| Quote: | 
   
  
	| This BLOB is not a valid UTF-8 byte sequence, because the byte X'8c' is not a valid UTF-8 start byte: | 
   
 
rekarm01 is correct. You should never have tried to cast the bytes of the MQMD header as characters. The MQMD contains a mixture of character and binary ( non-character ) data. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | lancelotlinc | 
		  
		    
			  
				 Posted: Thu Jan 26, 2012 5:50 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Jedi Knight
 
 Joined: 22 Mar 2010 Posts: 4941 Location: Bloomington, IL USA 
  | 
		  
		    
			  
				If your trying to print the MQMD.MsgId or MQMD.CorrelationId, here is some snazzy code to do the same from a JCN...
 
 
   
	| Code: | 
   
  
	      for( int i = 0; i < 24; i++ ){ 
 
                
 
        String iHexStr = Integer.toHexString( Id[i] ); 
 
        if ( iHexStr.length()>2 ) iHexStr = iHexStr.substring( iHexStr.length()-2 ); 
 
        if ( iHexStr.length()<2 ) refId = refId + "0"; 
 
        refId = refId + iHexStr;      
 
                
 
      }  | 
   
 
 
 
Good luck. _________________ http://leanpub.com/IIB_Tips_and_Tricks
 
Save $20: Coupon Code: MQSERIES_READER | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | cong_ren | 
		  
		    
			  
				 Posted: Fri Jan 27, 2012 9:08 am    Post subject: Thanks for all your replies.  But just wondering... | 
				     | 
			   
			 
		   | 
		
		
		   Newbie
 
 Joined: 25 Jan 2012 Posts: 2
  
  | 
		  
		    
			  
				Thank you all who responded!  Greatly appreciated.
 
 
I spent some of my time yesterday looking at the issue and tried 2 following attempts, both of which seems to resolve that casting issue:
 
 
1. Remove the CCSID parameter from the casting statement as recommended by rekarm01 and simply leave it as a HEX.
 
 
2. Changed the default windows codepage from 437 to 65001 and without changing the CCSID parameter.
 
 
I am still relatively new to MB and the code page.  I sort of understand that BLOB is not a valid CHARACTER string and there can be sequences of strings within which cannot be converted to a CHARACTER (such as 'c8').  But I don't understand why what I did above seems to resolve the issue.
 
 
For #1, by removing the CCSID parameter, what does MB use instead for the casting?  The default OS code page or the incoming message code page? Or neither?
 
 
For #2, it seems like MB takes the default OS code page into consideration.  But how and when? | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | kimbert | 
		  
		    
			  
				 Posted: Fri Jan 27, 2012 9:21 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Jedi Council
 
 Joined: 29 Jul 2003 Posts: 5543 Location: Southampton 
  | 
		  
		    
			  
				
   
	| Quote: | 
   
  
	| For #1, by removing the CCSID parameter, what does MB use instead for the casting? The default OS code page or the incoming message code page? Or neither?  | 
   
 
see  http://publib.boulder.ibm.com/infocenter/wmbhelp/v7r0m0/topic/com.ibm.etools.mft.doc/ak05680_.htm
 
Specifically, the row which explains BLOB to CHARACTER casts. By removing the CCSID clause you revert to the behaviour in the first paragraph ( the BLOB is not interpreted as CHARACTER data, it gets converted to a hexBinary string ). | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | 
		    
		   |