[英]How to pass an array of strings or a string vector to an IN clause in a parameterized SQL query?
我的executeQueries.ec文件中有此代碼
sprintf(sqlQuery,
"select distinct e.emp_id, e.join_date \
from employees e
where e.emp_id in (?) and e.dob <= '%s')");
$prepare empDataStmt from $sqlQuery;
if (sqlca.sqlcode)
{
fprintf(stderr, "Error %d in prepare empDataStmt%s\n",
sqlca.sqlcode, sqlQuery);
return 0;
}
$declare empDataCursor cursor for incptDatesStmt;
if (pcs_sql_check("Error in declaring empDataCursor Stmt"))
{
return 1;
}
$open empDataCursor using $empIds_,dob_ ;
當我dbx代碼並打印empIds_
,我在控制台上得到了這個:
""04-Emp1","W2-Emp2""
這意味着empIds_的內容為"04-Emp1","W2-Emp2"
(包括引號)。 問題是empIds
的數量可以是1到100或500之間的任何值。例如,它甚至可以是:
"04-Emp1","W2-Emp2","04-Emp4","W2-Emp3","0A-Emp1","E2-Emp7"
因此,我無法使我的代碼正常工作。 有人可以幫助我使用“?”編寫此代碼嗎? 用於可以處理任意數量empIds
參數化查詢。 請注意,empIds_的內容將始終嵌入雙引號。 我不知道這是好事還是壞事,但我無能為力。
您在向我們展示的內容中有一些句法問題:
sprintf(sqlQuery,
"select distinct e.emp_id, e.join_date \
from employees e
where e.emp_id in (?) and e.dob <= '%s')");
那不會編譯; 您需要在employees e
之后再加一個反斜杠。 我強烈建議避免在字符串中使用反斜杠換行符; 請改用字符串串聯。
sprintf(sqlQuery, "select distinct e.emp_id, e.join_date from employees e "
"where e.emp_id in (?) and e.dob <= '%s')");
注意,字符串的兩個部分之間只有空格(注釋也算作空格)。 C編譯器將此類字符串連接為單個字符串。
現在,在C源代碼級別上, sprintf()
調用在語法上是正確的; 它在語義上仍然不正確,因為它包含%s
並且您尚未提供要復制的字符串。 您應該使用占位符?
日期,因為您將其作為第二個參數傳遞給$open
語句(但實際上沒有占位符)。
然后,您可以通過編寫以下代碼來避免顯式的准備操作:
$ DECLARE empDataCursor FOR
SELECT DISTINCT e.emp_id, e.join_date
FROM employees e
WHERE e.emp_id IN ($empIds_) AND e.dob <= $dob_;
但是,不幸的是,這對您不起作用。 問題的症結在於您試圖將字符串作為IN子句的值列表傳遞。 它根本不能那樣工作。 如果有一個值,則需要一個占位符( ?
); 如果您有兩個值,則需要兩個占位符,依此類推。
因此,我們最后回到完整的准備好的語句,並將empIds替換為字符串:
int reqlen;
reqlen = snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT e.emp_id, e.join_date"
" FROM employees e WHERE e.emp_id IN (%s) AND e.dob <= '%s'",
empIds_, dob_);
if (reqlen >= sizeof(sqlQuery))
...truncated SQL...larger sqlQuery needed...
$ PREPARE empDataStmt FROM $sqlQuery;
...SQL error check...
$ DECLARE empDataCursor FOR empDataStmt;
...SQL error check...
$ OPEN empDataCursor; /* No USING clause! */
...SQL error check...
...code as before...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.