|
Как работать с переменными типа char при использовании конструкции execute direct "...." в хранимых процедурах и триггерах? |
|
Фактически, все, что следует после слова direct - это символьное выражение. И допускает оно использование как констант (строк в кавычках), так и символьных переменных (типа char), которые можно "склеивать" вместе знаком + для получения текста запроса. Пусть, например, Вам надо обновить запись в строке таблицы AUTO, в которой значение колонки MAKE должно равняться значению, записанному в переменной make типа char. Тогда можно использовать такой запрос: execute direct "update auto set .... where make = '" + make +"';"; Т.е. мы строим запрос по частям. Обратите внимание, как используются апострофы ( ' ) для того, чтобы получить правильный с точки зрения SQL запрос. Аналогично при построении запросов можно использовать и переменные других типов, но прежде чем конкатенировать их с другими частями, надо преобразовать значение в строку при помощи функции tochar. Если же требуется получить значение типа char из БД, то используйте курсоры, как и для любых других типов данных, выбираемых как результат select-запроса. Т.е. вместо конструкции execute direct определите курсор нужной структуры, откройте его через open ... for direct "..." и считывайте данные из курсорной переменной. Сам запрос в open можно строить по частям так же, как и в execute direct. |
|
Меня заинтересовали, в частности, функции для работы с датами. Как я понял, у вас невозможно вычислить дату в процедуре (или в операторе SELECT) по имеющейся (или выбранной из другой таблицы) дате и временному интервалу (например, в секундах). Это необходимо для выбора записей (или событий, содержащихся в этих записях) по временному интервалу. |
|
Это всё есть. И работает. Даты можно складывать/вычитать. Далее приводится небольшой пример работы с датами. --------------------------------------------------------------------------------- SELECT COUNT(*) FROM ddd WHERE ddd.D BETWEEN SYSDATE -(TO_DATE('01.01.0001:00:05' , 'DD.MM.YYYY:HH:MI') - TO_DATE('01.01.0001' , 'DD.MM.YYYY')) AND SYSDATE + (TO_DATE('01.01.0001:00:05','DD.MM.YYYY:HH:MI') -TO_DATE('01.01.0001' , 'DD.MM.YYYY')); ------------------------------------------------------- или еще проще: ------------------------------------------------------- SELECT COUNT(*) FROM ddd WHERE ddd.D BETWEEN SYSDATE - TO_DATE('00:05' , 'HH:MI') AND SYSDATE + TO_DATE('00:05' , 'HH:MI'); ------------------------------------------------------- Это, конечно, не столь удобно, как хотелось бы, но можно. Только писать константы в to_date нужно строго по тому формату, который указан. |
| 10.11.2004 |
Подскажите, существуют ли какие либо case-средства для создания структуры БД под ЛИНТЕР, с последующей генерацией базы. |
|
Собственных средств у ЛИНТЕР нет. Однако никто не мешает использовать, например, PowerDesigner. В дистрибутив ЛИНТЕР 5.9.26, к сожалению, на сайте его ещё нет, включен конфигурационный файл для работы с PowerDesigner. Сам конфигурационный файл можно забрать отсюда: ftp://ftplinter:ftplinter@ftp.relex.ru/pd/Linter.xdb Также, во все дистрибутивы ЛИНТЕР входит утилита EWC. Она предназначена для конвертирования схемы БД, разработанной с помощью ERWIN/ERX в схему БД СУБД ЛИНТЕР. Результатом работы EWC является набор SQL-скриптов на диалекте СУБД ЛИНТЕР, начиная с версии 5.x. Исходная (конвертируемая) схема БД должна быть предварительно создана с помощью ERWIN версии 2.6 или 3.5 для любой БД, поддерживаемой ERWIN и сохранена в формате .erx. |
| 20.05.2003 |
Существует ли в СУБД ЛИНТЕР механизм рассылки сообщений клиентским приложениям, аналог Oracle alert или Interbase event? Может ли сервер уведомлять клиентское приложение об изменениях данных в таблице или же клиенту необходимо самому опрашивать интересующие его таблицы? |
|
|
|
Может ли ЛИНТЕР обслуживать более 300 постоянно подключенных пользователей? |
|
Да. Хотя реальных задач таких нет, есть только до сотни пользователей. |
|
Как в UNIX запустить два ядра СУБД ЛИНТЕР на одной машине? |
|
Спасибо. Это вопрос практика. Для понимания этого необходимо внимательно прочитать документацию на предмет использования переменной среды LINTER_MBX. Внимательное ее изучение в комплексе с умением устанавливать переменные среды в соответствующих ОС позволит без проблем решить поставленный вопрос. Для запуска двух сетевых серверов необходимо обратить внимание на то, что каждый сетевой сервер обслуживает только один сетевой порт (socket number). И один порт не могут обслуживать два сетевых сервера. Следовательно, для каждого сервера необходимо задавать свой порт через параметр /p сетевого драйвера. Значение переменной LINTER_MBX по умолчанию 20561, а сетевого порта - 1060. |
|
Какова процедура создания распределенной базы на нескольких Linux-машинах (ЛИНТЕР, версия 5.7)? |
|
Это очень интересный вопрос. Вы без проблем можете использовать работу с несколькими базами данных одновременно из одной программы. Но на этом простота заканчивается. Нормальной реализации распределенной БД в данный момент у нас нет. Точнее есть, но ее производительность очень низкая - настолько низкая, что в реальной задаче использовать ее не представляется возможным. Мы знаем об этой проблеме, но пока не можем предложить удовлетворительного решения. В настоящий момент доступна версия Linter Replication Server. Она позволяет реализовать асинхронную репликацию - режим работы, при котором модификации с одного сервера через некоторое время, но все же поступят на удаленный сервер. При этом целостность реплицируемой транзакции не нарушается, но если в процессе репликации обнаруживается конфликт, то вся транзакция не реплицируется. Демонстрационную версию данного продукта скоро можно будет загрузить с нашего сервера. Над проблемами синхронной репликации мы тоже сейчас работаем, но пока еще нельзя назвать более или менее четкие сроки. Можно только сказать, что первым шагом будет реализация двухфазной фиксации, которая позволит на уровне прикладной задачи реализовать распределенность. |
|
Надо ли для оптимизации работы индексов в СУБД ЛИНТЕР их периодически пересоздавать? |
|
Пересоздавать, видимо, нет необходимости - они достаточно удачно балансируются сами. Однако у нас нет разбиения таблиц на части, так что это может несколько снизить общую производительность. |
|
Я уже спрашивала вас о типе данных extfile. Поддерживается ли работа с удалёнными файлами? |
|
В спецификации extfile отсутствует имя узла, на котором размещен файл, поэтому СУБД ЛИНТЕР поддерживает тип данных extfile только для локальных файлов ("локальными" для нее считаются и файлы, размещенные на сетевых дисках компьютера). Доступ к удаленным данным типа extfile, размещенным в удаленных БД, осуществляется из клиентского приложения с помощью сетевых средств (а из Java-приложений - через JDBC-драйвер) |
|
Расскажите, пожалуйста, как мне в теле триггера осуществить выборку значения типа int из одной таблицы и в конструкции execute direct вставить в другую таблицу. Если это возможно, приведите пример. |
|
Это делается так же, как и в обычной хранимой процедуре. Пример: declare var c cursor(i int); // можно какие-то еще поля .... code .... open c for direct "select i from <ваша таблица> where <ваше условие>;"; // выборка execute direct "insert into <другая таблица>(<ее колонка>) values("+itoa(c.i)+");"; .... end Если на словах, то: 1. Выбираем данные через курсор. 2. Используем их при формировании insert (или любого другого) запроса, применяя точечную нотацию для доступа к полю курсора и соответствующую функцию преобразования значения в текст. |
| 24.07.2003 |
У меня возник вопрос по данным типа DATE в ЛИНТЕРе. Дело в следующем: хочу приспособить ЛИНТЕР собирать интернет-трафик по клиентам. Загвоздка в следующем: при записи данных в поле типа DATE, которое описано в DEFAULT SYSDATE в это поле пишется не локальное время с сервера, а время по Гринвичу. Как заставить ЛИНТЕР писать данные в формате местного времени, а не мирового? Или как по мировому времени можно восстановить местное с учетом перехода на зимнее/летнее время в SELECT запросе? |
|
Для преобразования между часовыми поясами можно использовать функции SQL TO_LOCALTIME и TO_GMTIME. Хотя, в спецификации вторым параметром обеих функций передаётся значение одной из предопределённых констант, задающих "локальный" часовой пояс, эта часть функциональности пока не реализована. Обе функции следует вызывать только с одним параметром (значение даты, которую необходимо преобразовать). При этом под локальным временем подразумевается время по часам сервера, на котором работает СУБД. Пример : select TO_LOCALTIME(SYSDATE) - TO_GMTIME(SYSDATE) from $$; |
| 19.08.2003 |
Как получить имя пользователя, установившего соединение с БД, из вложенной хранимой процедуры? То есть - вызываем первую процедуру (е01), из нее вызываем вторую (е02) и вот там не можем получить имя юзера: procedure e01() result bool for debug code; ... call e02(); ... procedure e02() result bool for debug declare var c cursor(user char(18)); var p_user char(9); code; ... open c for direct "select distinct user from e02;"; p_user := substr(c.user,1,9); выдает ошибку BADCURSOR . Это баг или фича? А вообще, есть какие-либо особенности при использовании вложенных хранимых процедур? |
|
Особенностей со вложенностью, кажется, нет. Довольно неприятным, на мой взгляд, ограничением использования хранимых процедур вообще, является невозможность в select-запросе получить результат хранимой процедуры, которая в свою очередь тоже выполняет select-запрос: "select ..., my_proc(...),... from..." На данный момент, просто негде хранить результаты промежуточных запросов. Реализация этой возможности потребует сейчас серьёзных переделок.* А в процедуре e01 разве работает? Попробуйте заменить e02 именем таблицы или представления. * - уже реализовано |
| 20.08.2003 |
Вопрос по обработке транзакций в хранимых процедурах. Пытаемся создать промежуточную точку сохранения (set savepoint a1;), spc упорно считает, что все, что идет после директивы SET, является ошибочным идентификатором. Как правильно описать точку сохранения? |
|
Язык хранимых процедур несколько отличен от интерактивного SQL. Для выполнения запроса нужно либо явно открывать дочерний канал (курсор), либо использовать конструкцию execute direct. Причём, сам запрос необходимо брать в кавычки: execute direct "set savepoint a1"; (это нужно для реализации возможности динамического создания запроса). |
| 04.11.2004 |
Что означает код завершения 6720 при запуске базы Линтера 5.7? База не запускается из администратора. Как с этим бороться? |
|
Этот код означает, что, скорее всего, время в ОС было сдвинуто вперёд (при работающей БД), а после этого возвращено назад. Другой причиной возникновения этой ошибки может являться внутренний сбой, который приведёт к подобному эффекту. СУБД требуется, чтобы время двигалось всегда вперёд - по нему определяется уникальность момента работы. В случае сдвигов вперёд, а затем назад, это требование нарушается. СУБД имеет возможность работы с синтетическим временем внутри - при этом время внутреннее будет постепенно приближаться к реальному. Для этого необходимо указать параметр запуска ядра /TCORRECT (и указывать его каждый раз до момента выравнивания реального и синтетического времени). Это время не будет влиять на результат функции sysdate - эта функция будет возвращать реальное время всегда. Параметр /tcorrect можно указать в ключе ImagePath для соответствующего сервиса или в командной строке (пакетном файле) на запуск. |
| 30.11.2004 |
Я работаю с LINTER под МСВС, и у меня возник вопрос, связанный с использованием интерфейса LINAPI. При вызове функции LINTER_GetCursorOption(...)с параметром 'cAnswerDesc' в выходном буфере - структуре 't_ParamDesc' заполняется только поле Owner. Тоже происходит и при вызове LINTER_GetStatementOption с параметром 'sAnswerDesc'. С другими параметрами отрабатывает нормально. В примерах работы со структурой 't_ParamDesc' не нашел. |
|
С большой долей вероятности можно сказать, что у Вас некорректно установлен макрос _VER_MAX. Его значение или вообще отсутствует или содержит значение несоответствующее реальной версии ядра СУБД. От значения этого макроса зависит размер (и сама структура) t_ParamDesc. Необходимо задать этот макрос при трансляции модуля. В случае, если у Вас используется версия 5.7 или версия ЛИНТЕР-ВС, должно быть указано значение _VER_MAX=570 Если версия 5.9 - _V E R_MAX=590 |
| 06.12.2005 |
Есть ли возможность автоматизированной или каким-либо образом контролируемой из другой программы установки вашей СУБД? История вопроса такова. Необходимо написать установщик, который вместе с вашей СУБД устанавливает на сервер необходимый пакет ПО и создает необходимые таблицы. Возможно, необходимо создать какой-либо файл *ini? Или что-то еще? Хотелось бы иметь возможность создать файл сценария, который содержал бы в себе ответы на все вопросы, возникающие в процессе установки. |
|
СУБД ЛИНТЕР не требует специальных процедур установки. Она устанавливается исключительно скриптами, которые доступны для анализа. Кроме того, СУБД специально сконструирована для того, чтобы её можно было встраивать в приложения и устанавливать вместе с ними как единое целое - без внешнего вмешательства. Вам необходимо определить список необходимых компонентов, взять их из установленного дистрибутива и добавить в свой, внести минимальные изменения в Ваши установочные скрипты и, в момент установки выполнить необходимые действия с БД (создать таблицы, задать пароли и т.п.). В общем случае для этого не требуются ни привилегии администратора, ни какие-либо дополнительные действия. Наш стандартный скрипт установки автоматически не позволяет брать файл ответов, но это и не требуется. Всё, что нужно можно поправить в самом скрипте. |
| 15.02.2005 |
После установки русского дистрибутива под UNIX inl отображает текст ошибки в виде вопросиков. В таблице ERRORS также все русские буквы заменены вопросами. Как загрузить в базу русский текст ошибок? |
|
В этом нет необходимости. Текст расшифровки кодов возврата помещен в таблицу ERRORS в кодировке KOI8R. Однако, в отличие от window платформ, где кодировка клиента определяется автоматически и версий ЛИНТЕР до 6.0 , где кодировка по умолчанию всегда была KOI8-R, в версии 6.0 и выше для UNIX платформ кодировка по-умолчанию не задана. Поэтому СУБД просто не знает к какой кодировке преобразовывать русские буквы и заменяет каждый непреобразованный символ знаком вопроса. Для устранения проблемы необходимо выставить переменную окружения LINTER_CP=KOI8-R для клиентского приложения, что укажет на необходимость преобразования данных ядром именно к этой кодировке. |
|
Насколько мне известно, сертификатом Гостехкомиссии обладает только версия ЛИНТЕР 5.1. Она находится в Государственном реестре. Версия 5.9 там отсутствует. ВНИИНС распространяет именно 5.1. Но я слышал, что 5.9 намного лучше и хотелось бы использовать ее. Если версия ЛИНТЕР 5.9, сертифицированная под ОС МСВС? |
|
Сертификат Государственной технической комиссии при Президенте РФ выдан на систему управления базами данных ЛИНТЕР версии 5, функционирующую под управлением операционных систем Windows NT, UNIX, Novell NetWare. Таким образом, у нас фактически сертифицирована технология, и под действие сертификата попадают все подверсии версии 5, в том числе и 5.9. ВНИИНС распространяет специальную версию СУБД Линтер-ВС, разработанную компанией РЕЛЭКС под ОС МСВС. По сути Линтер-ВС 6.0 является клоном версии ЛИНТЕР 5.7, в которой была урезана функциональность. |
| 16.10.2004 |
В call-интерфейсе я не нашел способов работы с параметризованными и транслированными запросами. Я плохо искал или они есть только в linapi (которого нет в Линтер-ВС)? |
|
Их там действительно нет. Претранслированные запросы в ЛИНТЕР-ВС 6.0. можно использовать только посредством библиотеки PCI (через претрансляцию программ PCC). Можно получить с нашего сервера совместимую с ЛИНТЕР-ВС версию 5.7 и использовать интерфейсы, входящие в неё для работы. При необходимости, мы можем предоставить исходные тексты интерфейсных компонент для сертификации (по отдельному соглашению). |
|
Имеется ли возможность (или планируется) вызывать внешние процедуры? |
|
Такой возможности нет. И, скорее всего, не будет. Это связано с реализованной в ЛИНТЕР системой защиты информации от несанкционированного доступа. Внешнюю процедуру невозможно проконтролировать, а СУБД с такой "дырой" в защитных механизмах вряд ли может быть сертифицирована государственными органами. Некоторые внешние программы всё-таки допускаются (пока только для использования самой системой), например, текстовые фильтры для различных типов файлов (winword, rtf, pdf и т.п., а так же пользовательские) при создании индексов фразового поиска по документам. |