是否可以使用SQLSTATE为00000的负空值指示符?
我想知道某些操作是否需要检查SQLSTATE和null指示符值,如if语句。以下是我正在使用的示例:
EXEC SQL
SELECT 1 INTO :x1RcdFound:x1IndicatorVariable
FROM table1
WHERE value = :givenValue
AND value2 = 'helloWorld';
//this is where I am wondering if both checks need to happen
**if ( sqlstate = SQL_OK and x1RcdFound = 1 );**
虽然这是一个简单的例子,但有时候这是通过大循环运行的,或者需要使用多个语句,从长远来看,节省一点运行时间是有帮助的。这是尽可能简洁地编写代码的一部分,这在程序语言中经常被忽略。
答案 0 :(得分:2)
如果可以使用NULL值,那么你需要一个NULL指示符,然后是,你必须在得到一个SQLSTATE为00000后检查它。
但是,只有列可能为NULL时才需要NULL指示符。
在特定情况下,您提供的代码不会发生,您不需要NULL指示符。
EXEC SQL
SELECT 1 INTO :x1RcdFound
FROM table1
WHERE value = :givenValue
AND value2 = 'helloWorld';
您要么获得1,要么您不会获得任何行。这与包含NULL的列的RS不同。
事实上,如果没有行,您将获得SQLSTATE =' 02000' - > NO_DATA
我看到的大多数代码都是利用了这样一个事实:如果没有行,或者出现问题,主变量就会保持不变......
dcl-s xlRcdFound ind;
// note the definition of xlRcdFound as indicator
// ie. char(1) used as a Boolean.
xlRcdFound = *OFF;
EXEC SQL
SELECT '1' INTO :x1RcdFound
FROM table1
WHERE value = :givenValue
AND value2 = 'helloWorld';
if SqlExceptionOccurred(SQLSTATE:*ON);
//report SQL exception
elseif xlRcdFound;
//do something
endif;
dcl-proc SqlExceptionOccurred;
dcl-pi *n ind;
mySqlState char(5) value;
allowNoData ind value;
end-pi;
if allowNoData;
return %subst(mySqlState:1:2) > '02';
endif;
return %subst(mySqlState:1:2) >= '02';
end-proc;
答案 1 :(得分:0)
在给定的示例中,由于您选择的是文字值,因此结果可能为NULL的唯一情况是没有找到数据时,在这种情况下,SQLSTATE值将为02000
。换句话说,如果SQLSTATE是00000
,则结果不能为NULL。