SQLSTATE是否会为00000,负空指标?

时间:2018-01-30 15:10:25

标签: sql db2 rpgle

是否可以使用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 );**

虽然这是一个简单的例子,但有时候这是通过大循环运行的,或者需要使用多个语句,从长远来看,节省一点运行时间是有帮助的。这是尽可能简洁地编写代码的一部分,这在程序语言中经常被忽略。

2 个答案:

答案 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。