Я вижу следующий фрагмент кода в устаревшем приложении, которое обращается к 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 */
}
В последних версиях IDS есть таблица с именем типа 'sysdual'. Когда я создаю базу данных, я создаю себе таблицу под названием «dual». Классическим представлением таблицы с одним элементом является «SELECT refer_num.nextval FROM systables WHERE tabid = 1'» (или, если это педантично, поэтому код будет работать и с базами данных MODE ANSI, «SELECT refer_num.nextval FROM» informix ".systables WHERE tabid = 1' '). –
Кроме того, в более поздних версиях IDS (на самом деле любая версия IDS с последовательностями имеет достаточно недавний характер), вы можете использовать EXECUTE IMMEDIATE для уменьшения объема кода. –
Я всегда предпочитал подход «table (set {1)) или тот, который упоминает Джонатан (используя предложение tabid = 1), поскольку по крайней мере один из наших разработчиков решил добавить еще одно значение к пользовательскому sysdual таблицу, которую мы создали, в результате чего различные фрагменты кода бомбили ... – calvinkrishy