我们遇到一个问题,一个C程序使用OCI将值插入到oracle数据库中
表结构为:
desc table employee;
Name Null? Type
EMPLOYEE_ID NUMBER
SALARY NUMBER
DEPARTMENT_ID NUMBER
我们在桌面上使用的查询是:
Insert into employee(employee_ID, salary, department_id) values ( :1, DECODE(:2, 4294967295, -1, :2), :3);
我们打算在带解码的insert语句中做的是if the value of "salary" (:2) is equal to 4294967295
然后insert the value -1 into the database otherwise insert the original value (:2)
在C程序中,三个值绑定到查询。
执行查询时,我们收到以下错误消息:
错误 - OCI_ERROR ORA-01008:并非所有变量绑定
在使用DECODE的OCI语句调用中,可以使用相同的绑定变量两次吗?有没有办法可以修改查询并仍然实现薪水价值的转换?
答案 0 :(得分:1)
将您的sql语句更改为:
Insert into employee(employee_ID, salary, department_id) values ( :1, DECODE(:2, 4294967295, -1, :3), :4);
并按以下顺序传递绑定变量
employee_ID, salary, salary, department_id
请注意,薪水需要根据您的要求传递两次
答案 1 :(得分:0)
我会:
Insert into employee(employee_ID, salary, department_id) values ( :employee_ID, DECODE(:salary, 4294967295, -1, :salary), :department_id);
并使用:
然后仅绑定
employee_ID, salary, department_id (order wouldn't matter anymore)
所有具有相同名称的占位符都绑定到单个绑定变量(空间和性能高效)
答案 2 :(得分:0)
快速而肮脏。
编写你的C代码,模仿你期望OCI做的事情:
class OracleQuery{
public:
OracleQuery(std::string aQuery) : query_(aQuery){}
size_t setString(size_t aPlaceHolder, const std::string& aSubS);
std::string getSQL(){ return query_; }
private:
std::string query_;
};
size_t OracleQuery::setString(size_t aPlaceHolder, const std::string& aSubS)
{
std::string toReplace = "'" + aSubS + "'";
size_t countReplace = 0;
std::string myPlaceHolder = ":" + std::to_string(aPlaceHolder);
size_t len = myPlaceHolder.size();
std::string myNewQuery;
size_t pos = 0;
while (true){
pos = query_.find(myPlaceHolder, pos);
if (pos == std::string::npos)
break;
++countReplace;
query_.replace(pos, len, toReplace);
}
return countReplace;
}
当您需要它时,您可以使用setInt()方法扩展它。依此类推......