簡體   English   中英

如何在參數化SQL查詢中將字符串數組或字符串向量傳遞給IN子句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM