HP / Tandem TACL如何在SQL like子句中将%用作值

时间:2018-08-30 13:09:37

标签: sql wildcard control-characters hp-nonstop tandem

在我的TACL中,我试图创建一个变量作为SQLCI命令的输入。我想使用带有%的LIKE子句作为通配符。每次它将%替换为?导致SQL语句未返回所需结果。

代码段摘要:

 ?TACL macro
 #Frame
 #Set #informat plain
 #Set #outformat pretty
 #Push stoprun DC fidata var1 mailmast sqlvol sqlsvol IsOpen EMLFile ans emlline
 #Push mailfile mfile likeit charaddr sqlin sqlout test
 [#Def True text |body|-1]
 [#Def False text |body|0]

剪切插入代码以减少长度-剪切代码有效

 == select <program name> from <full mailmast filename> where mm_file_prefix
 == like "<likename>%" for browse access;
 [#If Not [StopRun]
 |then|
   #Setv test "~%"
   #Set #trace -1
   #Set SqlIn select mm_program_name from [mailmast] where mm_file_prefix
   #appendv sqlin "like ""[LikeIt]~%"" for browse access;"
   SQLCI/Inv Sqlin,outv sqlout/
 ] == end of if

运行代码时,我将显示变量,并且它已将%替换为?

-TRACE- -19st 1 v 调用变量:MAILMAST.1   #设置SqlIn从$ DATA5.SQL2510.MAILMAST中选择mm_program_name,其中mm_file_p 修复 -跟踪- -20-   #appendv sqlin“ like”“ [LikeIt]                           ^ -跟踪- -20- 调用变量:LIKEIT.1   #appendv sqlin“喜欢”“ ED?”“以进行浏览访问;” -跟踪- -20天测试 ? -22st 1 v   SQLCI / Inv Sqlin,outv sqlout / -跟踪- -23天平方 从$ DATA5.SQL2510.MAILMAST中选择mm_program_name,其中mm_file_prefix 像“ ED?”用于浏览访问; -24-

由于%不存在通配符,因此该SQL语句无法显示正确的记录。

问题是,如何将%放入TACL变量中而不将其更改为??

经过编辑,以将重复的代码替换为TACL宏-MEH的开头

1 个答案:

答案 0 :(得分:1)

我真的不喜欢回答我自己的问题,因为那看起来像是我只是为了让自己看起来更聪明而进行设置,但是在等待期间继续研究时,我找到了答案。请参见下面的代码片段:

?TACL macro
 #Frame
 #Set #informat plain
 #Set #outformat pretty
 #Push stoprun DC fidata var1 mailmast sqlvol sqlsvol IsOpen EMLFile ans emlline
 #Push mailfile mfile likeit charaddr sqlin sqlout test
 [#Def True text |body|-1]
 [#Def False text |body|0]
 [#Def ascii struct
   Begin
     BYTE byt0 value 37;
     CHAR pcent REDEFINES byt0;
   End;
 ] == end of struct

请注意该结构的添加。这样可以为一个字节分配一个十进制值37(%),并将其重新定义为在like语句中使用的字符。

 == select <program name> from <full mailmast filename> where mm_file_prefix
 == like "<likename>%" for browse access;
 [#If Not [StopRun]
 |then|
   #Set test [ascii:pcent]
   #Set #trace -1
   #Set SqlIn select mm_program_name from [mailmast] where mm_file_prefix
   #append sqlin like "[LikeIt][ascii:pcent]" for browse access;
   SQLCI/Inv Sqlin,outv sqlout/
 ] == end of if

请注意使用结构[ascii:pcent],这确实有效。

感谢所有阅读我的问题的人。