静态SQL
静态sql分non-select和select两种。non-select包括insert、update和delete
静态non-select, 变量前加冒号
C/EXEC SQL
C+ UPDATE HTXAFP/CSCUSTP SET C1CSCN =‘SARA1’
C+ WHERE C1CSBR = 1 AND C1CSSR = :W0CONT
C/END-EXEC
动态sql
动态sql分non-select和select两种。non-select包括insert、update和delete。
动态sql最重要的是动态sql的合成。合成动态sql有两种方法。
第一种是直接用字符串合成,例子如下:
eg1.
这里最重要的是红色部分。一定要注意单引号的数量。
eg2:
字符型变量: 因为是字符型变量,用单引号把字符的引号引起来
第二种是在sql中预留要填充的位置,例子如下:
sqlstm = 'update ptrlib/custom ’ +
'SET NAME = ? WHERE ’ +
‘CUST = ?’
这里与上面不同的是具体的值是用?来代替的。
下面是两种方法的具体实现:
第一种
d sqlstm s 1024a inz(blanks) VARYING
d custc s 5a inz(‘A0001’)
d namec s 20a inz(‘Lucy and Lily’)
c eval sqlstm = ‘UPDATE PTRLIB/CUSTOM ’ +
c ‘SET NAME = ‘’’+%trim(namec)+’’’’+
c ’ WHERE CUST = ‘’’+%trim(custc)+’’’’
c***************************************************
c* run this sql once,you can skip prepare *
c*/exec sql *
c*+ PREPARE S1 FROM :sqlstm *
c*/end-exec *
c****************************************************
c/exec sql
c+ EXECUTE IMMEDIATE :sqlstm
c/end-exec
c*
c seton lr
c return
第二种
d sqlstm s 1024a inz(blanks) VARYING
d custc s 5a inz(‘A0001’)
d namec s 20a inz(blanks)
c eval sqlstm = 'update ptrlib/custom ’ +
c 'SET NAME = ? WHERE ’ +
c ‘CUST = ?’
c/exec sql
c+ PREPARE s1 FROM :sqlstm
c/end-exec
c
c eval namec = ‘lily’
c
c/exec sql
c+ EXECUTE s1 USING :namec,:custc
c/end-exec
c*
c seton lr
c return
要是执行select的话需要使用cursor。例子如下
D*
D sqlstm S 1024A VARYING
D file S 21A inz(‘ptrlib/custom’)
D count S 10p 0 inz(zero)
C
C eval sqlstm = 'select count() from ’ +
C %trim(file)
C
C/EXEC SQL
C+ prepare s1
C+ from :sqlstm
C/END-EXEC
C*
C/EXEC SQL
C+ declare c1
C+ cursor for s1
C/END-EXEC
C*
C/EXEC SQL
C+ open c1
C/END-EXEC
C*
C/EXEC SQL
C+ FETCH c1 INTO :count
C/END-EXEC
c if SQLCOD = ZERO
c count dsply
c endif
C/EXEC SQL
C+ CLOSE c1
C/END-EXEC
C
C SETON lr
C RETURN