DB2 Exception Handling - exception

The problem that I am facing is primarily on Exception Handling! When an exception occurs I want to put that data in another log table with the error message. However, in DB2 I am not able to figure out a way to retrieve the corresponding error message for the raised SQLSTATE.
PS: I have a stored procedure for this migration and I am not using any other language to call it.
Though, I have already queried about this and infact I got some valuable pointers.
Refer: DB2 Exception handling
However, if I use the basic SQLERRM function then for a basic 23502 I get the following message:
"SQLSTATE 23502: An insert or update value is null, but the column cannot contain null values."
Whereas what I really want is the Column name that threw this error, appended to this message! Is there any way, the DB2 could give me a complete error, with the column name the error was raised in?
Thanks in advance ;-)...
Harveer

You need to retrieve all of the tokens from the SQLCA when you encounter such an error. The tokens will contain either the table name and column name, or the numeric table id and column position within the table, starting with zero. The SQLERRM function takes in those tokens and uses them to reconstruct an error message that is as detailed as what you see from the command line.

Related

SSIS Package Based on a avariable

Hi I've an SSIS Package which Does tasks like a)Truncate Last 7 days data from a table if any and then re-load it and all theses are placed in a sequence container and it run's fine.Now I'm planning to remove the hard coded value of 7 and introduce a variable NoOfDays which I can provide at run time.Can this be achieved?
I added a variable and tried to map it to the parameter of the ExecuteSQL Task...It gave the following error:
I even want the value to be available to the next step Data Flow Task
[Execute SQL Task] Error: Executing the query "delete from USER_CONTENT where CONVERT..." failed with the following error: "The variable name '#NoOfDays' has already been declared. Variable names must be unique within a query batch or stored procedure.
Statement(s) could not be prepared.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
The query I'm using is
delete from USER_CONTENT
where CONVERT(date,ISSUE_DATE)>=CONVERT(DATE,GETDATE()-7)
and it is against an OLE-DB connection.
I do not have enough points to post a comment so I will have to ask you this way: are you using query parameters with a "?", if not, then in order to use a package variable with a stored procedure, you will need to write your statement to use them, also, don't name your parameters, use the default 0,1,2 etc.. that the package assigns.

How do i output an SQL Error in MySQL

I've declared an handler which will handle SQLEXCEPTION, in the clean up code i had it do SELECT 'My Handle';, i ran a script that fails because of a primary key violation and it worked cause i got my output.
the problem with DECLARE ... HANDLE FOR SQLEXCEPTION is that when there is an error it will run though it's doesn't say what error triggered it, so i want to output the error
How do i output the SQL Error using a MySQL Query, i don't care if i can only output the error code/id i just need something to output giving me an indication on what the error is so i can fix the problem
EDIT: in case if it's not obvious, this code is in an SQL Procedure
There is nothing in the DECLARE HANDLER documentation on this functionality. You could handle the errors MySQL returns to your application and print or log them that way.
I actually haven't used any handles, but i think you can make your code into a stored procedure and then run the stored procedure!! You might find MySQL accepts what you are trying to do then.

MySQL Error Handling within a Transaction

I have a procedure which accepts a parameter UserID Varchar(10). If I enter a userID which is longer than 10 characters I get the following message:
call procedure1x('Thisismorethanten'); ERROR 1406 (22001): Data too long for column 'UserID' at Row 1.
How do i create an error handler for this error so that when it happens, instead of displaying the sentence above, it says something else like "Try again. The UserID is too long."?
Error handling is typically done using TRY...CATCH block. MySQL uses DECLARE ... HANDLER to handle errors. The documentation has some sample blocks that should help you.

'Return'/Abort mySql stored procedure

I want to abort/quit/return from a stored procedure when a condition is not met.
I'm not sure how to do it. Googling didn't help me much because:
The version of MySql on our servers is 5.1 (<5.5 and hence no signal sqlstate).
I don't want to put everything in if..then..else statements (there will be multiple levels of nesting in my case)
I don't want to call an_invalid_procedure to raise an exception.
Are there alternatives?
Something wrong with....
...
BEGIN
<do stuff>
IF (<your condition>) THEN
<do more stuff>
END IF;
END$$
What I do in such cases is to:
Create table called errors with one column containing textual error messages and UNIQUE index on it. I fill the table with errors I want to support.
When I need specific error to raised, I insert the error message into errors table. Since it's already there, I am violating a UNIQUE key so error is raised. In my application I can watch for MySQL error #1062 (that's the code for 'Duplicate value for key...' error and use regexp to extract my error message to show it to user/log it/whatever;

Cannot cast the error output on a SSIS insert task

We are doing a SSIS package to do some data transfer and insert it in a table (SQL SERVER 2008). It fails for one of the row and we want to log the issue by redirecting the error output. So far so good.
The problem is it won't let us cast one of the column, a DT_I4, to a string (DT_STR or DT_WSTR).
We get this error everytime :
[Log History Write Error [338]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR
The funny part is, if we change our destination element to a fast-load, we are actually able to cast the error output to a string.
Would anybody know why is that?