2017-01-30 28 views
0

我正在使用下面的代碼來獲取oracle表中的列數。使用'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」作爲輸出。 我指的表中有幾列。

我在這裏做錯了什麼嗎?

下面是聲明部分......在C-串

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

回答

1

不要 「逃」 了'。它只會在字符串中有\',這不是你想要的,因爲'是數據庫字符串引用,現在您爲數據庫轉義,並且數據庫現在不瞭解該查詢。

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]已經爲空。 (雖然沒有傷害。)

+0

我用「sprintf」來準備查詢,它被成功執行了。但是,我仍然得到0列的數量。 – NJMR

+0

Sory,我不「說」嵌入式SQL。但我注意到你告訴SQL忽略錯誤。你現在可能不會得到可以幫助你的錯誤/警告。 –

+0

由於「if(sqlca.sqlcode == 1403)break」,我得到一個錯誤;「沒有循環。因此我忽略了這些錯誤。 – NJMR