CftClub.ru
Клуб специалистов ЦФТ-Банк

'#include

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Damir
Участник - экстремал


Вступление в Клуб: 29.03.2013
СообщениеПт Янв 16, 2015 11:48   '#include Ответить с цитатой
Полезность: Нет оценки
Добрый день.

В секции Клиент-скрипта можно использовать такую конструкцию (сравнительно недавно для себя открыл её):
'#include ::[RUNTIME].[LIB_555]

Вопрос: в ЦФТ-шной доке эта фича где-то описана?

Хочется узнать, что в Клиент-скрипте еще возможно использовать:
-макросы подстановки, например, как в pl+ '&'
-исполняемые макросы
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеПт Май 08, 2015 10:56    Ответить с цитатой
Полезность: Нет оценки
Полагаю, речь об этом:


2. Семантика.
2.1. Реализована поддержка расширенного набора inline-команд условной компиляции
через специальный формат строки-комментария. Команда условной компиляции
идентифицируется знаком '#' в первой позиции текста комментария. Реализован
следующий набор команд:
#DEFINE id {/USUAL SUBSTITUTE PROCESS EXECUTE/} {QUOTE} {text}
определение переменной условной компиляции или макроса (если задан text) с
именем id, при этом текст макроса text может также содержать другие макросы,
в т.ч. и исполняемые. Тип макроса также может быть определен сразу после его
имени (если тип макроса не указан, тогда используется опция USUAL, т.е. простой
макрос), а также может быть указана опция заключения результата макроса в кавычки
(ключевые слова quote, quotes).
#UNDEF id
удаление переменной условной компиляции и макроса с именем id.
#INCLUDE {[} id {]} { /. ::/ {[} id {]} }
импорт макро-определений и переменных условной компиляции другой операции в текущую
операцию. Если указан только один id, то он воспринимается как короткое имя операции
в том же типе, что и импортирующая операция, если заданы оба id, тогда первый
воcпринимается как ID класса, а второй как короткое имя импортируемой операции.
#IFDEF id
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если существует макрос
или переменная условной компиляции с именем id.
#IFNDEF id
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если не существует
как макрос, так и переменная условной компиляции с именем id.
#IF expression
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если значение
логического выражения expression, вычисляемое на этапе компиляции, будет равно
true.
#ELSIF expression
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если значение
логического выражения expression, вычисляемое на этапе компиляции, будет равно
true и при этом ни одно из предшествующих условий (#IF,#IFDEF,#IFNDEF,#ELSIF)
не выполнилось.
#ELSE
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до команды #ENDIF в случае, если ни одно из предшествующих условий
(#IF,#IFDEF,#IFNDEF,#ELSIF) не выполнилось.
#ENDIF
Операторы #IF,#IFDEF,#IFNDEF должны обязательно завершаться командой #ENDIF, они могут
содержать несколько #ELSIF блоков и команду #ELSE, которая если задана, то должна
предшествовать только #ENDIF. Т.е. структура операторов условной компиляции #IF,#IFDEF,
#IFNDEF аналогична структуре исполняемого оператора IF в PL/Plus. Операторы могут быть
вложены друг в друга по правилу скобок #IF,#IFDEF,#IFNDEF - #ENDIF.
Логическое выражение expression может содержать (в порядке убывания приоритета конструкций):
- конструкции макроподстановок в стандартном формате (&ID);
- конструкция exists(id) (аналог конструкции defined в C++), которая возвращает
TRUE, если макрос или переменная условной компиляции с именем id определена,
FALSE в противном случае;
- имена (идентификаторы) макросов и переменных условной компиляции, на место которых
в текст выражения вставляется строковая константа с содержимым тела макроса или
логическая константа TRUE, соответственно;
- вызовы стандартных функций (пакета STANDARD, например, LTRIM, RTRIM);
- вызовы функций пакетов ТЯ с указанием префикса пакета (например, LIB.IS_PARENT);
- пользовательских библиотечных функций (с использованием синтаксиса полного разыменования
[class]::[lib_name].func_name);
- любые агрегирующие конструкции логических выражений (операторы OR, AND, IN, LIKE, NOT,
IS NULL, IS NOT NULL, операторы сравнения, арифметические операторы и конкатенацию с последующим
сравнением).
ПРИМЕЧАНИЕ:
1. В отличие от операторов pragma, inline-команды могут использоваться в любом
месте текста PL/Plus независимо от синтаксических структур языка.
2. В отличие от операторов pragma, inline-команды управляют формируемым текстом
операции и выполняются один раз на этапе разбора исходного текста, тогда как
операторы pragma выполняются 2 раза - сначала при семантическом разборе, затем при
формировании результирующего текста (это различие имеет значение при одновременном
использовании однотипных inline-команд и соответствующих прагм).
3. При определении тела макроса (text в #DEFINE) могут использоваться другие макросы,
причем в результирующий текст определяемого макроса вставляются их значения.
4. В телах исполняемых макросов (PROCESS,EXECUTE) конструкции обращения к библиотечным
функциям в полном формате ([class]::[lib_name].func_name) автоматически заменяются
на соответствующие обращения к именам PL/SQL пакетов, содержащих эти функции.
Пример:
pragma macro(ddd,'UTILS.HASH_VALUE([1])',execute);
pragma macro(eee,&ddd(user),substitute,quotes);
pragma macro(xxx,'[1]+[2]',execute);
/*# define fff*/ -- определяем переменную условной компиляции fff
pragma if_def(fff) -- true при первом проходе, т.к. определена предыдущим оператором,
-- false при втором проходе, т.е. последующий текст не будет включен в
-- результирующий
--# define fff usual &xxx(1,3) = rtrim('5''','''')
-- определение макроса с именем fff
s:=
/*# if &fff and exists(xxx) or not [user]::[checker2](stdlib.userid,null,3,4,5)=123 */
'2'
/*#else*/
--#ifndef bbb
'3'
--#elsif not exists(bbb) and not exists(ccc)
'4'
--#elsif not exists(ddd)
'5'
--#else
'6'
--#endif
/*#endif*/
pragma end_if
/*#undef fff*/ -- удаление макроса и переменной условной компиляции с именем fff
Alex294
Участник со стажем


Вступление в Клуб: 02.06.2013
СообщениеПт Май 08, 2015 11:31   Re: '#include Ответить с цитатой
Полезность: Нет оценки
Damir пишет:
Вопрос: в ЦФТ-шной доке эта фича где-то описана?

В annex4.chm в разделе "Создание клиент-скрипта"
Damir
Участник - экстремал


Вступление в Клуб: 29.03.2013
СообщениеПн Май 11, 2015 01:32    Ответить с цитатой
Полезность: Нет оценки
wolfio пишет:
...

Ваще мимо! вопрос был про Клиент-скрипт.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru