SIGNAL statement
The SIGNAL statement is used to return an error or warning condition. It causes an error or warning to be returned with the specified SQLSTATE, along with optional message text.
Syntax
signal-information:
Description
- SQLSTATE VALUE
- Specifies the SQLSTATE that will be returned. Any valid SQLSTATE
value can be used. It must be a character string constant with exactly
five characters that follow the rules for SQLSTATEs:
- Each character must be from the set of digits ('0' through '9') or non-accented upper case letter ('A' through 'Z').
- The SQLSTATE class (the first two characters) cannot be '00' because it represents successful completion.
If the SQLSTATE does not conform to these rules, an error occurs.
- sqlstate-string-constant
- A character string constant with a length of five bytes that is a valid SQLSTATE value.
- SQL-variable-name or SQL-parameter-name
- Specifies an SQL variable or SQL parameter that contains a valid
SQLSTATE value.
- SQL-variable-name
- Specifies an SQL variable that is declared within the compound-statement. SQL-variable-name must be defined as a CHAR or VARCHAR data type, have a length of five bytes, must not be null, and must contain a valid SQLSTATE value.
- SQL-parameter-name
- Specifies an SQL parameter that is defined for the procedure and contains the SQLSTATE value. The SQL parameter must be defined as a CHAR or VARCHAR value, have a length of five bytes, must not be null, and must contain a valid SQLSTATE value.
- SQL-condition-name
- Specifies the name of the condition that will be returned. condition-name must be declared within the compound-statement.
- SET MESSAGE_TEXT
- Specifies a string that describes the error or warning. The string
is returned in the SQLERRMC field of the SQLCA or with the GET DIAGNOSTICS
statement.
- diagnostic-string-expression
- An expression with a data type of CHAR or VARCHAR that returns a character string of up to 1000 bytes that describes the error or warning condition. For information on how to obtain the complete message text, see GET DIAGNOSTICS statement.
- (diagnostic-string-expression)
- An expression with a data type of CHAR or VARCHAR that returns
a character string of up to 1000 bytes that describes the error or
warning condition. For information on how to obtain the complete message
text, see GET DIAGNOSTICS statement.
This syntax variation is only provided within the scope of a CREATE TRIGGER statement for compatibility with previous versions of Db2. To conform with the ANS and ISO standards, this form should not be used.
Notes
While any valid SQLSTATE value can be used in the SIGNAL statement, programmers should define new SQLSTATEs based on ranges reserved for applications. This practice prevents the unintentional use of an SQLSTATE value that might be defined by the database manager in a future release.
If a SIGNAL statement is issued, the SQLCODE that is returned is based on the SQLSTATE as follows:
- If the specified SQLSTATE class is either '01' or '02', a warning or not-found message is returned, and the SQLCODE is set to +438.
- Otherwise, an exception is returned and the SQLCODE is set to -438.
The other fields of the SQLCA are set as follows:
- SQLERRDx fields are set to zero.
- SQLWARNx fields are set to blank.
- SQLERRMC is set to the first 70 bytes of MESSAGE_TEXT.
- SQLERRML is set to the length of SQLERRMC.
- SQLERRP is set to ROUTINE.
When the SQLSTATE or condition indicates that an exception (an SQLSTATE class other than '01' or '02') is returned, one of the following actions occurs:
- If a handler exists for the specified SQLSTATE, condition, or SQLEXCEPTION, the exception is handled, and control is transferred to that handler.
- Otherwise, the exception is not handled, and control is immediately returned to the end of the compound statement.
When the SQLSTATE or condition indicates that a warning (SQLSTATE class '01') is returned, one of the following actions occurs:
- If an active handler exists for the specified SQLSTATE, condition, or SQLWARNING, the warning is handled, and control is transferred to that handler.
- Otherwise, the warning is not handled, and processing continues with the next statement.
When the SQLSTATE or condition indicates that a not-found condition (SQLSTATE class '02') is returned, one of the following actions occurs:
- If an active handler exists for the specified SQLSTATE, condition, or not-found condition, the not-found condition is handled, and control is transferred to that handler.
- Otherwise, the not-found condition is not handled, and processing continues with the next statement.
When the SIGNAL statement is issued in a handler, no active handler exists.
SIGNAL SQLSTATE sqlstate-string-constant
SET MESSAGE_TEXT = diagnostic-string-expression
SIGNAL SQLSTATE sqlstate-string-constant
(diagnostic-string-expression)
Examples
Example 1: The following example shows an SQL procedure for an order system that signals an application error when a customer number is not known to the application. The ORDERS table includes a foreign key to the CUSTOMER table, requiring that the CUSTNO exist before an order can be inserted.
CREATE PROCEDURE SUBMIT_ORDER
(IN ONUM INTEGER, IN CNUM INTEGER,
IN PNUM INTEGER, IN QNUM INTEGER)
LANGUAGE SQL
SPECIFIC SUBMIT_ORDER
MODIFIES SQL DATA
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE VALUE '23503'
SIGNAL SQLSTATE '75002'
SET MESSAGE_TEXT = 'Customer number is not known';
INSERT INTO ORDERS (ORDERNO, CUSTNO, PARTNO, QUANTITY)
VALUES (ONUM, CNUM, PNUM, QNUM);
END
CREATE TRIGGER CK_AVAIL
NO CASCADE BEFORE INSERT ON ORDERS
REFERENCING NEW AS NEW_ORDER
FOR EACH ROW MODE DB2SQL
WHEN (NEW_ORDER.QUANTITY > (SELECT ON_HAND FROM PARTS
WHERE NEW_ORDER.PARTNO = PARTS.PARTNO))
BEGIN ATOMIC
SIGNAL SQLSTATE '75001' ('Insufficient stock for order');
END