嵌入式SQL中主机变量的动态数量

时间:2018-09-03 11:45:51

标签: cobol embedded-sql

我在MicroFocus COBOL中有以下代码:

move 'select * from TABLE where a = ? and b = ? and c = ? to w-sql
exec sql
  open cur_read_2 using  :w-a,
                         :w-b,
                         :w-c
end-exec

但是此选择可以是可变的,因此这里仅作为示例

... where a = ? ...

... where a = ? and c = ? ...

那么,我可以以某种方式动态设置exec-sql部分,以在此处拥有适当数量的主机变量吗?在实际情况下,我有7个WHERE变量,并且可能有完整的组合列表。

1 个答案:

答案 0 :(得分:0)

分析此示例。也许可以帮助您。

WORKING STORAGE SECTION.

 *VARIABLE COMMAND
01 DSTRING.
   02 STR-LEN       PIC S9(04)  COMP VALUE +200
   02 STR-TEXT      PIC  X(200).               

01 W-ABC.
   03 W-A-FROM         PIC 99 VALUE 0.
   03 W-A-TO           PIC 99 VALUE 99.

   03 W-B-FROM         PIC XX VALUE LOW-VALUES.
   03 W-B-TO           PIC XX VALUE HIGH-VALUES.

   03 W-C-FROM         PIC 99 VALUE 0.
   03 W-C-TO           PIC 99 VALUE 99.


 *DECLARE CURSOR
    EXEC SQL
         DECLARE CURSOR1 CURSOR
             FOR STMT1
    END-EXEC.



 PROCEDURE DIVISION.

    MOVE 'TABLE'          TO TS-TABLA.

* YOU MUST MOVE THE VALUE THAT CORRESPONDS TO THE VARIABLE TO USE.
* THE VARIABLE THAT IS NOT USED IS LEFT WITH THE DEFAULT VALUE
*       
    MOVE W-INPUT-A        TO W-A-FROM.
    MOVE W-INPUT-A        TO W-A-TO.

* THE W-B VARIABLE IS NOT USED. LEFT WITH THE DEFAULT VALUE.

    MOVE W-INPUT-C        TO W-C-FROM.
    MOVE W-INPUT-C        TO W-C-TO.

*OPEN CURSOR
    MOVE SPACES           TO STR-TEXT
    STRING ‘SELECT * FROM’
    ‘ ‘                 DELIMITED BY SIZE
    TS-TABLA            DELIMITED BY SPACE
    ‘ ‘                 DELIMITED BY SIZE
    ‘WHERE’             DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘A’                 DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘BETWEEN ?’         DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘AND ?’             DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘AND’               DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘B’                 DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘BETWEEN ?’         DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘AND ?’             DELIMITED BY SIZE
    ‘AND’               DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘C’                 DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘BETWEEN ?’         DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘AND ?’             DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘ORDER BY’          DELIMITED BY SIZE
    ‘ ‘                 DELIMITED BY SIZE
    ‘CODIGO’            DELIMITED BY SIZE
    INTO STR-TEXT.

*OPEN CURSOR (cont)

    EXEC  SQL
        PREPARE STMT1 FROM :DSTING
    END-EXEC.

    EXEC  SQL
        OPEN CURSOR1 USING :WS-CODIGO-SQL
    END-EXEC.