2009-10-09 2 views
1

Я вижу следующий фрагмент кода в устаревшем приложении, которое обращается к Informix через C. Может ли кто-нибудь объяснить, что пытается выполнить SQL в коде? Благодарю.Объяснение фрагмента кода

EXEC SQL BEGIN DECLARE SECTION; 
int i_tableref; 
EXEC SQL END DECLARE SECTION; 

    /* Some code here */ 

if (!i_sel_ref) 
{ 
    exec sql begin declare section; 
    const char *sql1 = 
     "select refer_num.nextval from table (SET{''})"; 
    exec sql end declare section; 
    exec sql prepare oref_sel_fid from :sql1; 
    if (sqlca.sqlcode != SQL_OK) 
    { 
     /* some code */ 
    } 
    /* More code */ 
} 

ответ

1

Я считаю, что это получение следующего значения из последовательности базы данных refer_num. Последовательности - это способ генерации значений для числовых уникальных идентификаторов - немного похожих на столбцы IDENTITY в некоторых СУБД. Я не знаю Informix, но я предполагаю, что «table (SET {''}) - это способ генерации псевдо-таблицы с 1 строкой, чтобы вы могли выполнять оператор select, который фактически не нужен для доступа любая реальная таблица базы данных. Oracle имеет специальную таблицу с именем DUAL для этой цели, и это было бы обычным явлением в Oracle:

select refer_num.nextval from dual; 
+0

В последних версиях IDS есть таблица с именем типа 'sysdual'. Когда я создаю базу данных, я создаю себе таблицу под названием «dual». Классическим представлением таблицы с одним элементом является «SELECT refer_num.nextval FROM systables WHERE tabid = 1'» (или, если это педантично, поэтому код будет работать и с базами данных MODE ANSI, «SELECT refer_num.nextval FROM» informix ".systables WHERE tabid = 1' '). –

+0

Кроме того, в более поздних версиях IDS (на самом деле любая версия IDS с последовательностями имеет достаточно недавний характер), вы можете использовать EXECUTE IMMEDIATE для уменьшения объема кода. –

+0

Я всегда предпочитал подход «table (set {1)) или тот, который упоминает Джонатан (используя предложение tabid = 1), поскольку по крайней мере один из наших разработчиков решил добавить еще одно значение к пользовательскому sysdual таблицу, которую мы создали, в результате чего различные фрагменты кода бомбили ... – calvinkrishy

-1

для получения следующего значения генератора последовательности в Informix:

выберите your_seq_generator_name.nextval из table(set{1});