2017-01-30 3 views
0

Я использую приведенный ниже код, чтобы получить количество столбцов в таблице оракула.Получение числа столбцов в таблице с использованием «Proc C-C``

char selectQuery[30000] = {'\0'}; 
strcpy(selectQuery, "SELECT COUNT(*) FROM USER_TAB_COLUMNS WHERE TABLE_NAME=\'"); 
strcat(selectQuery, tableName); 
strcat(selectQuery, "\'"); 

strcpy((char*) stmt.arr, selectQuery); 
stmt.len = strlen((char*) stmt.arr); 
stmt.arr[stmt.len]= '\0'; 

EXEC SQL WHENEVER SQLERROR CONTINUE; 
EXEC SQL WHENEVER NOT FOUND CONTINUE; 

EXEC SQL DECLARE SELECTCOLNU STATEMENT; 
EXEC SQL PREPARE SELECTCOLNU FROM :stmt; 

if(sqlca.sqlcode != 0) 
{ 
    DEBUG_LOG("SQL-ERR:Preparation of SELECT Query to get number of columns failed: Ora-Err: %d %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 
    return PREPARATION_FAILURE; 
} 

EXEC SQL EXECUTE SELECTCOLNU INTO:columnsNo; 
if(sqlca.sqlcode < 0) 
{ 
    DEBUG_LOG("SQL-ERR:Execute failed: Ora-Err: %d %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 
    return EXECTUION_FAILURE; 
} 

DEBUG_LOG("Number of columns: %d\n", columnsNo); 

Когда я выполняю код, он не дает никаких ошибок, но я получаю «Число столбцов: 0» в качестве вывода. В таблице, на которую я ссылаюсь, имеется несколько столбцов.

Я делаю что-то не так здесь?

Ниже приводится раздел объявлений ...

EXEC SQL BEGIN DECLARE SECTION; 
    int columnsNo; 
    VARCHAR stmt[MAX_SQL]; 
EXEC SQL END DECLARE SECTION; 

ответ

1

Не "бежать" в ' в C- строке. Он будет иметь \' только в строке, и это не то, что вы хотите, потому что ' - это цитата из строки базы данных, которую вы теперь избегаете для базы данных, и база данных не понимает запрос сейчас.

sprintf(selectQuery, "SELECT COUNT(*) FROM USER_TAB_COLUMNS WHERE TABLE_NAME='%s'", tableName); 


Примечание:

stmt.len = strlen((char*) stmt.arr); 
stmt.arr[stmt.len]= '\0'; 

В приведенных выше strlen подсчитывает количество символов до нулевого символа. Таким образом, stmt.arr[stmt.len] уже null. (Нет вреда.)

+0

Я использовал «sprintf» для подготовки запроса, он был успешно выполнен. Но все же я получаю 0 за количество столбцов. – NJMR

+0

Sory, я не говорю «встроенный SQL». Но я замечаю, что вы указываете SQL игнорировать ошибки. Теперь вы не можете получить ошибки/предупреждения, которые могут вам помочь. –

+0

Я получал ошибку из-за "if (sqlca.sqlcode == 1403) break;" без петли. Поэтому я проигнорировал ошибки. – NJMR

Смежные вопросы