OCI语句和绑定变量

时间:2014-05-27 23:48:29

标签: sql oracle oci

我们遇到一个问题,一个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语句调用中,可以使用相同的绑定变量两次吗?有没有办法可以修改查询并仍然实现薪水价值的转换?

3 个答案:

答案 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);

并使用:

OCIBindByName()

然后仅绑定

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()方法扩展它。依此类推......