SQL EXECUTEのエラー処理

例えば次のようなSQL文を実行するとしよう。

create table staff_UNIQUE1(st_id INT32, st_name varchar(20) UNIQUE Not null)

メソッドは次のようになる。

$sql:="create table staff_UNIQUE1(st_id INT32, st_name varchar(20) UNIQUE Not null);"
C_TEXT(vSQL)
vSQL:=$sql
ON ERR CALL("JCL_D02_OnErrCall_SQL_EXECUTE")
SQL LOGIN(SQL_INTERNAL; ""; "")
SQL EXECUTE($sql)
SQL LOGOUT

C_TEXON ERR CALLに与えたエラー処理メソッド「JCL_D02_OnErrCall_SQL_EXECUTE」の中身は次。

//JCL_D20_OnErrCall_SQL_EXECUTE
//20240121 wat
//sql実行時のエラーハンドリング: all local or process variables must be declared

C_TEXT($msg)
C_LONGINT($i; $sizeOfAry)
ARRAY LONGINT($aryCords; 0)
ARRAY TEXT($aryComp; 0)
ARRAY TEXT($aryText; 0)

$msg:=$msg+vSQL+Char(Carriage return)

GET LAST ERROR STACK($aryCords; $aryComp; $aryText)
$sizeOfAry:=Size of array($aryCords)
$msg:="GET LAST ERROR STACK: $sizeOfAry=["+String($sizeOfAry)+"]"+Char(Carriage return)
For ($i; 1; $sizeOfAry)
	$msg:=$msg+"cord=["+String($aryCords{$i})+"]"+Char(Tab)
	$msg:=$msg+"component=["+$aryComp{$i}+"]"+Char(Tab)
	$msg:=$msg+"error text=["+$aryText{$i}+"]"+Char(Carriage return)
	
	If ($aryCords{$i}=1301)
		$msg:=$msg+"PARSING FAILED!"+Char(Carriage return)
	End if 
	$msg:=$msg+Char(Carriage return)
	
End for 
$msg:=$msg+vSQL+Char(Carriage return)

結果はこうなる。

問題を起こしたSQL文を取得する方法が分からなかったので、プロセス変数に代入しておいたら参照できた。エラー処理メソッドで使う変数は、ローカル変数もプロセス変数も宣言されていないと変なエラーになったので注意。