不,我們不能使用主機變量提供一個表-name到Pro * C中的靜態SQL語句。
要爲Oracle11.2克引用Oracle Pro*C Programmer's Guide:
不能使用輸入主機變量提供SQL關鍵字或數據庫對象的名稱。 [..]如果您需要在運行時更改數據庫對象名稱,請使用動態SQL。另請參見第13章「Oracle動態SQL」。
在Pro * C中,Oracle提供了執行SQL語句的不同方法。主要區別在於靜態和動態方法。對於動態,有幾個子方法允許不同的自由度。
靜態SQL語句不是100%靜態的 - 您可以在where子句表達式(作爲操作數)中使用輸入/輸出主變量,在插入語句中提供值,作爲選擇目標等。但不要指定表名。這對靜態嵌入式SQL來說太「動態」了。
請注意,您仍然可以在動態準備的SQL語句中使用主機變量。建議這樣做以避免SQL注入問題並提高性能(當多次執行語句時)。
實施例(使用Oracle動態SQL方法3):
const char *table_name[3] = {"emp", "mgr", "all"};
unsigned table_name_size = 0;
unsigned i = 0;
for (i = 0; i<table_name_size; ++i) {
char stmt[128] = {0};
snprintf(stmt, 128,
"SELECT emp_name "
" FROM %s "
" WHERE "
" emp_id = :emp_id",
table_name[i]);
EXEC SQL PREPARE emp_stmt FROM :stmt;
// check sqlca.sqlcode ...
EXEC SQL DECLARE emp_cursor CURSOR FOR emp_stmt;
EXEC SQL OPEN emp_cursor USING :emp_id;
// check sqlca.sqlcode ...
EXEC SQL FETCH emp_cursor INTO :ename;
// check sqlca.sqlcode ...
EXEC SQL CLOSE emp_cursor;
// check sqlca.sqlcode ...
// ...
}