HP / Tandem TACL Как использовать% в качестве значения в предложении SQL like - PullRequest
0 голосов
/ 30 августа 2018

В моем 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- -19-й 1 в Вызывающая переменная: MAILMAST.1 #Set SqlIn выберите mm_program_name из $ DATA5.SQL2510.MAILMAST, где mm_file_p refix -TRACE- -20- #appendv sqlin "like" "[LikeIt] ^ -TRACE- -20- Вызывающая переменная: LIKEIT.1 #appendv sqlin "like" "ED?" "для доступа;" -TRACE- -20-й тест ? -22-й 1 в SQLCI / Inv Sqlin, outv sqlout / -TRACE- -23-й квлин выберите mm_program_name из $ DATA5.SQL2510.MAILMAST, где mm_file_prefix как "ED?" для просмотра доступа; -24

Поскольку% отсутствует в качестве подстановочного знака, этот оператор SQL не может вызвать правильную запись.

Вопрос в том, как поместить% в переменную TACL и не изменить его на a?

Отредактировано для замены дублирующего кода при запуске макроса TACL - MEH

1 Ответ

0 голосов
/ 30 августа 2018

Мне действительно не нравится отвечать на мой собственный вопрос, потому что похоже, что я просто настраивал вещи, чтобы я выглядел умным, но продолжая свои исследования в ожидании, я нашел ответ. См. Фрагмент кода ниже:

?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

Обратите внимание на использование struct [ascii: pcent], и это работает.

Спасибо всем, кто прочитал мой вопрос.

...