単一行を返却するSQL文を実行するには、EXECUTE を使うことができます。 結果を保存するには、INTO 句を追加します。
EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 STMT PIC X(50) VARYING. 01 V1 PIC S9(9) COMP. 01 V2 PIC S9(9) COMP. 01 V3 PIC X(50) VARYING. EXEC SQL END DECLARE SECTION END-EXEC. MOVE "SELECT a, b, c FROM test1 WHERE a > ?" TO ARR OF STMT. COMPUTE LEN OF STMT = FUNCTION STORED-CHAR-LENGTH (ARR OF STMT). EXEC SQL PREPARE MYSTMT FROM :STMT END-EXEC. ... EXEC SQL EXECUTE MYSTMT INTO :V1, :V2, :V3 USING 37 END-EXEC.
EXECUTEコマンドはINTO句、USING句、この両方を持つことも、どちらも持たないこともできます。
クエリが2行以上の結果を返すことが想定される場合、以下の例のようにカーソルを使う必要があります。 (カーソルの詳細については“D.3.2 カーソルの使用”を参照してください)
EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 DBANAME PIC X(128) VARYING. 01 DATNAME PIC X(128) VARYING. 01 STMT PIC X(200) VARYING. EXEC SQL END DECLARE SECTION END-EXEC. MOVE "SELECT u.usename as dbaname, d.datname - " FROM pg_database d, pg_user u - " WHERE d.datdba = u.usesysid" TO ARR OF STMT. COMPUTE LEN OF STMT = FUNCTION STORED-CHAR-LENGTH (ARR OF STMT). EXEC SQL CONNECT TO testdb AS con1 USER testuser END-EXEC. EXEC SQL PREPARE STMT1 FROM :STMT END-EXEC. EXEC SQL DECLARE cursor1 CURSOR FOR STMT1 END-EXEC. EXEC SQL OPEN cursor1 END-EXEC. EXEC SQL WHENEVER NOT FOUND GOTO FETCH-END END-EXEC. PERFORM NO LIMIT EXEC SQL FETCH cursor1 INTO :DBANAME,:DATNAME END-EXEC DISPLAY "dbaname=" ARR OF DBANAME ", datname=" ARR OF DATNAME END-PERFORM. FETCH-END. EXEC SQL CLOSE cursor1 END-EXEC. EXEC SQL COMMIT END-EXEC. EXEC SQL DISCONNECT ALL END-EXEC.