SQLSTATE是否会有一个负的空指示符?

SQLSTATE是否会有一个负的空指示符?,sql,db2,rpgle,Sql,Db2,Rpgle,SQLSTATE为00000时是否可能有一个负的空指示符 我想知道某些操作是否需要同时检查SQLSTATE和null指示符值,比如if语句。以下是我正在使用的示例: EXEC SQL SELECT 1 INTO :x1RcdFound:x1IndicatorVariable

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 );**

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

在给定的示例中,由于您选择的是文本值,因此结果可能为NULL的唯一情况是找不到数据,在这种情况下,SQLSTATE值将为
02000
。换句话说,如果SQLSTATE为
00000
,则结果不能为NULL。

在给定的示例中,由于您选择的是文本值,因此结果可能为NULL的唯一情况是未找到数据,在这种情况下,SQLSTATE值将为
02000
。换句话说,如果SQLSTATE为
00000
,则结果不能为空。

如果可能为空值,因此需要空指示符,则必须在获得00000的SQLSTATE后进行检查

但是,只有当列可以为NULL时,才需要NULL指示符

在您提供的特定情况下,这种情况不会发生,您不需要空指示符

EXEC SQL                                                                           
  SELECT 1 INTO :x1RcdFound
    FROM table1                                                                   
      WHERE value = :givenValue                                                    
       AND value2 = 'helloWorld';
你要么得到1,要么没有行。这与包含NULL列的RS不同

事实上,如果没有行,您将得到SQLSTATE='02000'->no_数据

我看到的大多数类似于您的代码都利用了这样一个事实,即如果没有行,或者如果出现问题,主机变量将保持不变

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;

如果一个空值是可能的,因此您需要一个空指示符,那么是的,您必须在得到一个00000的SQLSTATE后检查它

但是,只有当列可以为NULL时,才需要NULL指示符

在您提供的特定情况下,这种情况不会发生,您不需要空指示符

EXEC SQL                                                                           
  SELECT 1 INTO :x1RcdFound
    FROM table1                                                                   
      WHERE value = :givenValue                                                    
       AND value2 = 'helloWorld';
你要么得到1,要么没有行。这与包含NULL列的RS不同

事实上,如果没有行,您将得到SQLSTATE='02000'->no_数据

我看到的大多数类似于您的代码都利用了这样一个事实,即如果没有行,或者如果出现问题,主机变量将保持不变

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;

SQLSTATE 00000意味着成功执行,但是您仍然需要检查空指示符。IRL您不需要检查您的操作。在执行SQL之前,设置x1rcdfound=0。执行SQL后,该值为1或0。(假设有保证的一行结果可能会添加fetch first 1 rows only子句)除了记录错误之外,甚至不用检查SQL结果,因为found标志已设置为0或1。SQLSTATE 00000表示执行成功,但您仍然需要检查null指示符。IRL您不需要检查您的操作。在执行SQL之前,设置x1rcdfound=0。执行SQL后,该值为1或0。(假设保证一行结果可能会添加fetch first 1 rows only子句)除了记录错误之外,甚至不必检查SQL结果,因为found标志已设置为0或1。这是我的猜测和希望。谢谢。这是我的猜测和希望。谢谢。在过程中使用ind似乎会简单得多,但这会产生额外的开销吗?这似乎是一个很好的导出过程,可以在公司内部使用。我不理解开销的问题……但是,是的,示例SqlExceptionOccurred()是一个很好的候选程序,可以放入公共*SRVPGM中。在中,由于每次要使用导出过程调用,因此需要更多的处理能力成本。根据SQL的数量,一次调用可以轻松地执行十到五十次。ILE过程调用的成本基本上是不存在的。这就是ILE的全部目的。谢谢。我介于Java/RPG和Java之间,我们更担心每一行代码,因为GUI应用程序往往需要更长的时间。似乎在过程中使用ind会简单得多,但这会产生额外的开销吗?这似乎是一个很好的导出过程,可以在公司内部使用。我不理解开销的问题……但是,是的,示例SqlExceptionOccurred()是一个很好的候选程序,可以放入公共*SRVPGM中。在中,由于每次要使用导出过程调用,因此需要更多的处理能力成本。根据SQL的数量,一次调用可以轻松地执行十到五十次。ILE过程调用的成本基本上是不存在的。这就是ILE的全部目的。谢谢。我介于Java/RPG和Java之间,我们更担心每一行代码,因为GUI应用程序往往需要更长的时间。