Создание временной таблицы с PID в ESQL / C

Я использую код ESQL / C для обеспечения внутренней поддержки пользовательского интерфейса, подключающегося к базе данных Informix. Я создаю временную таблицу внутри своего кода. Но я предполагаю, что если несколько пользователей используют этот пользовательский интерфейс одновременно, временная таблица может уже существовать в базе данных, что может создать проблему. Итак, может ли кто-нибудь предложить, могу ли я создать временную таблицу с PID в качестве суффикса внутри моего кода ESQL / C

create temp table tabname_PID (name char(10));

В сценарии оболочки я обычно использую tabname_$$.


person Kundan Kumar    schedule 26.02.2013    source источник


Ответы (1)


Вы можете создать таблицу со встроенным в нее PID, но это не обязательно. Любая временная таблица видна только в том сеансе, который ее создает, поэтому вы можете использовать одно и то же имя таблицы в каждом сеансе (отдельной, но одновременно выполняющейся программе ESQL / C), не опасаясь конфликта.

Если, несмотря на заверения в том, что в этом нет необходимости, вы все же хотите это сделать, вам придется ПОДГОТОВИТЬ и ВЫПОЛНИТЬ (или DECLARE, OPEN, FETCH, CLOSE) операторы из строки:

snprintf(sql, sizeof(sql), "CREATE TEMP TABLE tabname_%d(name CHAR(10))", (int)getpid());
EXEC SQL PREPARE s FROM :sql;
EXEC SQL EXECUTE s;

или используйте EXECUTE IMMEDIATE (что здесь очевидный победитель):

EXEC SQL EXECUTE IMMEDIATE :sql;

Затем вам также нужно будет подготовить все запросы; одно явное преимущество использования временной таблицы с фиксированным именем заключается в том, что вам не нужно готовить все, что ссылается на временную таблицу, если вы этого не хотите (хотя часто есть преимущества использования PREPARE и т. д.).

Вам также не нужно использовать $$ в сценариях оболочки по той же причине - временные таблицы являются частными для сеанса.

person Jonathan Leffler    schedule 26.02.2013
comment
@Jonathan ..... Большое спасибо !! Означает ли это, что если я использую временную таблицу в одном терминале с некоторой обработкой, а затем открываю другой сеанс терминала, конфликта не будет? - person Kundan Kumar; 27.02.2013
comment
Да, это действительно так. Это также означает, что если у вас есть одна программа и вы выполняете EXEC SQL CONNECT TO 'dbase' AS 'c1';, а затем выполняете EXEC SQL CONNECT TO 'dbase' AS 'c2';, у вас есть два соединения (и, следовательно, сеансы), подключенные к одной и той же базе данных из одного и того же клиентского процесса, но временные таблицы для сеанса при подключении c1 являются отдельными из временных таблиц для сеанса связи c2. Временные таблицы являются частными для сеанса, который их создает. - person Jonathan Leffler; 27.02.2013