Oracle OCI、绑定变量和 ID IN (1, 2, 3) 等查询

2023-12-19

简洁版本:

我正在寻找以下 Java 技术的 C++ OCI 改编,其中代码能够将数字数组(数组大小可以变化)绑定到非 PL/SQL 中SELECT语句,然后在 a 中使用结果数组WHERE ID IN (...)风格检查。

http://rafudb.blogspot.com/2011/10/variable-inlist.html http://rafudb.blogspot.com/2011/10/variable-inlist.html

原问题:

我们有一个 C++ 应用程序,它通过 OCI 与 Oracle 通信。我们正在尝试修复通过连接文本生成 SQL 查询的旧代码;相反,我们希望尽可能多地使用绑定变量。出现了一个特殊情况,我们没有很好的解决方案。

SELECT * FROM MyTable WHERE ID IN (1, 4, 10, 30, 93)

哪里的(1, 4, 10, 30, 93)部分来自于vector<int>或其他一些灵活大小的数据容器。如果我们知道它总是五个值,我们可以这样做:

SELECT * FROM MyTable WHERE ID IN (:1, :2, :3, :4, :5)

但它可能是一项,也可能是十项,甚至可能是零项。显然,如果我们将查询构建为字符串,我们可以根据需要附加任意数量的数字,但目标是尽可能避免这种情况并坚持只绑定变量。

有没有好的方法来实现这一点?例如,在 OCI 中,我可以绑定一个数组,然后从中进行子选择吗?

SELECT * FROM MyTable WHERE ID IN (SELECT * FROM :1)

Where :1是 OCI 数组吗? (语法可能会有所不同。)有人有这方面的经验吗?示例代码将是天赐之物,因为我往往在编写原始 OCI 方面遇到困难。谢谢 :)

EDIT:如果可能的话,我希望做得比绑定由 PL/SQL 过程解析的字符串更好。我相信在很多情况下我们都会突破 4000 个字符的限制,而且我也觉得这只是用一种我习惯的字符串操作换取另一种我不习惯的字符串操作(而且我不能调试同样容易)。如果可能的话,我想将一组值(或某种形式的数据集)绑定到一个标准 SQL 语句中。

EDIT 2:一些调查发现了以下链接,它似乎正在做我想要的事情,但是是在 Java 中:http://rafudb.blogspot.com/2011/10/variable-inlist.html http://rafudb.blogspot.com/2011/10/variable-inlist.html有谁知道如何使这种方法适应 C++ OCI?


This example demonstrates approach with using collection type, defined in database to pass list of parameters.
SYS.ODCINumberList is standard collection type available for all users. Query, used in sample just select first 100 integers ( test http://sqlfiddle.com/#!4/d41d8/16996 ) and then filter this integers with list in IN(...) clause.

#include "stdafx.h"
#include <iostream>
#include <occi.h>

using namespace oracle::occi;
using namespace std;

// Vector type to pass as parameter list
typedef vector<Number> ValueList;

int _tmain(int argc, _TCHAR* argv[])
{
  Environment *env;
  Connection *con;

  // Note that Environment must be initialized in OBJECT mode 
  // to use collection mapping features.
  env = Environment::createEnvironment(Environment::OBJECT);

  con = env->createConnection ("test_user", "test_password", "ORACLE_TNS_NAME");

  try {

    Statement *stmt = con->createStatement(
                 "select * from "
                 " (select level as col from dual connect by level <= 100)"
                 "where "
                 "  col in (select column_value from table(:key_list))"
               );

    cout << endl << endl << "Executing the block :" << endl 
         << stmt->getSQL() << endl << endl;

    // Create instance of vector trype defined above 
    // and populate it with numbers.
    ValueList value_list;
    value_list.push_back(Number(10));
    value_list.push_back(Number(20));
    value_list.push_back(Number(30));
    value_list.push_back(Number(40));

    // Bind vector to parameter #1 in query and treat it as SYS.ODCINumberList type. 
    setVector(stmt, 1, value_list, "SYS", "ODCINUMBERLIST");

    ResultSet *rs = stmt->executeQuery();

    while(rs->next())
      std::cout << "value: " << rs->getInt(1) << std::endl;

    stmt->closeResultSet(rs); 
    con->terminateStatement (stmt);

  } catch(SQLException ex) {
    cout << ex.what();
  }


  env->terminateConnection (con);
  Environment::terminateEnvironment (env);

    return 0;
}

您可以使用各种 ODCIxxxList 类型 http://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dcicnstnts.htm#i76582通过 OCI 将数字、日期或字符串列表传递给 Oracle,甚至在 DB 中定义您自己的类型。

使用 Visual Studio 10 Express 编译的示例和此版本的 OCI 库 http://www.oracle.com/technetwork/database/occidownloads-083553.html。 针对 Oracle 11.2.0.3.0 进行了测试。

Update

下面是示例应用程序,它执行相同的操作,但使用普通的 C OCIxxx 函数。

//
// OCI collection parameters binding - example application
//

#include "stdafx.h"
#include <iostream>
#include <oci.h>
#include <oro.h>

using namespace std;

// connection parameters
const char *db_alias         = "ORACLE_DB_ALIAS";
const char *db_user_name     = "test_user";
const char *db_user_password = "test_password";

// helper error checking procedure to shorten main code, returns true if critical error detected
// and prints out error information
bool check_oci_error(char *error_point, OCIError *errhp, sword status, OCIEnv *envhp);

int _tmain(int argc, _TCHAR* argv[]) {

  //----- CONNECTION INITIALIZATION PART ------------------------------------------------------

  sword rc;
  OCIEnv *myenvhp;       /* the environment handle */
  OCIServer *mysrvhp;    /* the server handle */
  OCIError *myerrhp;     /* the error handle */
  OCISession *myusrhp;   /* user session handle */
  OCISvcCtx *mysvchp;    /* the  service handle */

  /* initialize the mode to be the threaded and object environment */
  /* NOTE: OCI_OBJECT must be present to work with object/collection types */
  rc = OCIEnvCreate(&myenvhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0, 0, 0, 0, (size_t) 0, (dvoid **)0);

  if( check_oci_error("OCIEnvCreate", NULL, rc, NULL) ) {
    return -1; 
  }

  /* allocate a server handle */
  rc = OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysrvhp, OCI_HTYPE_SERVER, 0, (dvoid **) 0);
  if( check_oci_error("OCIHandleAlloc(OCI_HTYPE_SERVER)", NULL, rc, myenvhp) ) return -1;

  /* allocate an error handle */
  rc = OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myerrhp, OCI_HTYPE_ERROR, 0, (dvoid **) 0);
  if( check_oci_error("OCIHandleAlloc(OCI_HTYPE_ERROR)", NULL, rc, myenvhp) ) return -1;

  /* create a server context */
  rc = OCIServerAttach(mysrvhp, myerrhp, (text *)db_alias, strlen (db_alias), OCI_DEFAULT);
  if( check_oci_error("OCIServerAttach()", myerrhp, rc, myenvhp) ) return -1;

  /* allocate a service handle */
  rc = OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysvchp, OCI_HTYPE_SVCCTX, 0, (dvoid **) 0);
  if( check_oci_error("OCIHandleAlloc(OCI_HTYPE_SVCCTX)", myerrhp, rc, myenvhp) ) return -1;

  /* set the server attribute in the service context handle*/
  rc = OCIAttrSet((dvoid *)mysvchp, OCI_HTYPE_SVCCTX, (dvoid *)mysrvhp, (ub4) 0, OCI_ATTR_SERVER, myerrhp);
  if( check_oci_error("OCIAttrSet(OCI_HTYPE_SVCCTX,OCI_ATTR_SERVER)", myerrhp, rc, myenvhp) ) return -1;

  /* allocate a user session handle */
  rc = OCIHandleAlloc((dvoid *)myenvhp, (dvoid **)&myusrhp,  OCI_HTYPE_SESSION, 0, (dvoid **) 0);
  if( check_oci_error("OCIHandleAlloc(OCI_HTYPE_SESSION)", myerrhp, rc, myenvhp) ) return -1;

  /* set user name attribute in user session handle */
  rc = OCIAttrSet((dvoid *)myusrhp, OCI_HTYPE_SESSION, (dvoid *)db_user_name, strlen(db_user_name), OCI_ATTR_USERNAME, myerrhp);
  if( check_oci_error("OCIAttrSet(OCI_HTYPE_SESSION,OCI_ATTR_USERNAME)", myerrhp, rc, myenvhp) ) return -1;

  /* set password attribute in user session handle */
  rc = OCIAttrSet((dvoid *)myusrhp, OCI_HTYPE_SESSION, (dvoid *)db_user_password, strlen(db_user_password), OCI_ATTR_PASSWORD, myerrhp);
  if( check_oci_error("OCIAttrSet(OCI_HTYPE_SESSION,OCI_ATTR_PASSWORD)", myerrhp, rc, myenvhp) ) return -1;

  rc = OCISessionBegin(mysvchp, myerrhp, myusrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
  if( check_oci_error("OCISessionBegin()", myerrhp, rc, myenvhp) ) return -1;

  /* set the user session attribute in the service context handle*/
  rc = OCIAttrSet( (dvoid *)mysvchp, OCI_HTYPE_SVCCTX, (dvoid *)myusrhp, (ub4) 0, OCI_ATTR_SESSION, myerrhp);
  if( check_oci_error("OCIAttrSet(OCI_HTYPE_SVCCTX,OCI_ATTR_SESSION)", myerrhp, rc, myenvhp) ) return -1;

  cout << endl << "Initialization done." << endl;

  //----- REGISTER TYPE INFORMATION ------------------------------------------------------

  // This section can be invoked once per session to minimize server roundtrips.

  char    *type_owner_name = "SYS";               
  char    *type_name       = "ODCINUMBERLIST";
  OCIType *type_tdo        = NULL;

  rc= OCITypeByName(
        myenvhp, myerrhp, mysvchp, 
        (CONST text *)type_owner_name, strlen(type_owner_name),
        (CONST text *) type_name, strlen(type_name),
        NULL, 0,
        OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, 
        &type_tdo
      );
  if( check_oci_error("OCITypeByName()", myerrhp, rc, myenvhp) ) return -1;

  //----- PREPARE PARAMETER INSTANCE ---------------------------------------------

  OCIArray *array_param = NULL;

  rc = OCIObjectNew(
         myenvhp, myerrhp, mysvchp, 
         OCI_TYPECODE_VARRAY, 
         type_tdo, NULL, OCI_DURATION_SESSION, TRUE,
         (void**) &array_param
       );
  if( check_oci_error("OCITypeByName()", myerrhp, rc, myenvhp) ) return -1;

  //----- FILL PARAMETER ---------------------------------------------------------

  OCINumber num_val;
  int       int_val;

  for(int i = 1; i <= 3; i++) {
    int_val = i*10;

    rc = OCINumberFromInt(myerrhp, &int_val, sizeof(int_val), OCI_NUMBER_SIGNED, &num_val);
    if( check_oci_error("OCINumberFromInt()", myerrhp, rc, myenvhp) ) return -1;

    rc = OCICollAppend(myenvhp, myerrhp, &num_val, NULL, array_param);
    if( check_oci_error("OCICollAppend()", myerrhp, rc, myenvhp) ) return -1;
  }


  //----- BIND PARAMETER VALUE AND EXECUTE STATEMENT ------------------------------

  OCIStmt   *mystmthp   = NULL;
  OCIDefine *col1defp   = NULL;
  double    col1value;  
  OCIBind   *bndp       = NULL;

  char      *query_text = "select * from "
                          " (select level as col from dual connect by level < 100)"
                          "where "
                          "  col in (select column_value from table(:key_list))";

  rc = OCIHandleAlloc(myenvhp, (void **)&mystmthp, OCI_HTYPE_STMT, 0, NULL); 
  if( check_oci_error("OCIHandleAlloc(OCI_HTYPE_STMT)", myerrhp, rc, myenvhp) ) return -1;

  rc = OCIStmtPrepare( 
         mystmthp, myerrhp, 
         (const OraText *)query_text, strlen(query_text), 
         OCI_NTV_SYNTAX, OCI_DEFAULT
       );
  if( check_oci_error("OCIStmtPrepare()", myerrhp, rc, myenvhp) ) return -1;

  // result column
  rc =  OCIDefineByPos(mystmthp, &col1defp, myerrhp, 1, &col1value, sizeof(col1value), SQLT_BDOUBLE, NULL, NULL, NULL, OCI_DEFAULT);
  if( check_oci_error("OCIDefineByPos()", myerrhp, rc, myenvhp) ) return -1;

  // parameter collection
  rc = OCIBindByName(
         mystmthp, &bndp, myerrhp,
         (text *)":key_list", strlen(":key_list"), 
         NULL, 0,
         SQLT_NTY, NULL, 0, 0, 0, 0,
         OCI_DEFAULT
       );
  if( check_oci_error("OCIBindByName()", myerrhp, rc, myenvhp) ) return -1;

  rc = OCIBindObject(
         bndp, myerrhp, 
         type_tdo, (dvoid **) &array_param, 
         NULL, NULL, NULL
       );
  if( check_oci_error("OCIBindByName()", myerrhp, rc, myenvhp) ) return -1;

  // execute and fetch
  rc = OCIStmtExecute(mysvchp, mystmthp, myerrhp, 0, 0, NULL, NULL, OCI_DEFAULT);
  if( check_oci_error("OCIBindByName()", myerrhp, rc, myenvhp) ) return -1;

  rc = OCIStmtFetch2(mystmthp, myerrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);

  while(rc != OCI_NO_DATA) {
    if( check_oci_error("OCIStmtFetch2()", myerrhp, rc, myenvhp) ) return -1;
    cout << "value: " << col1value << endl;
    rc = OCIStmtFetch2(mystmthp, myerrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
  }

  // free collection object parameter
  rc = OCIObjectFree(myenvhp, myerrhp, array_param, OCI_OBJECTFREE_FORCE);
  if( check_oci_error("OCIObjectFree()", myerrhp, rc, myenvhp) ) return -1;

  cout << endl << "Main test done." << endl;

  //------- FINALIZATION -----------------------------------------------------------
  rc= OCISessionEnd(mysvchp, myerrhp, myusrhp, OCI_DEFAULT);
  if( check_oci_error("OCISessionEnd()", myerrhp, rc, myenvhp) ) return -1;

  rc = OCIServerDetach(mysrvhp, myerrhp, OCI_DEFAULT);
  if( check_oci_error("OCIServerDetach()", myerrhp, rc, myenvhp) ) return -1;

  OCIHandleFree(myenvhp, OCI_HTYPE_ENV);

  cout << endl << "Finalization done." << endl;

  return 0;
}

// helper error checking procedure to shorten main code, returns true if critical error detected
// and prints out error information
bool check_oci_error(char *error_point, OCIError *errhp, sword status, OCIEnv *envhp) { 

  text errbuf[1024];
  sb4  errcode;
  bool ret_code = true;

  switch (status) { 
    case OCI_SUCCESS:
        ret_code = false;
      break;
    case OCI_SUCCESS_WITH_INFO:
        OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);
        cout << error_point << " Error: OCI_SUCCESS_WITH_INFO; Info: " << errbuf << endl;
        ret_code = (errcode == 436 || errcode == 437 || errcode == 438 || errcode == 439);
      break;
    case OCI_NEED_DATA:
        cout << error_point << " Error: OCI_NEED_DATA"<< endl;
      break;
    case OCI_NO_DATA:
        cout << error_point << " Error: OCI_NO_DATA"<< endl;
      break;
    case OCI_ERROR:
        OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);
        cout << error_point << " Error: " << errbuf << endl;
      break;
    case OCI_INVALID_HANDLE:
        cout << error_point << " Error: OCI_INVALID_HANDLE" << endl;
      break;
    case OCI_STILL_EXECUTING:
        cout << error_point << " Error: OCI_STILL_EXECUTE"<< endl;
      break;
    case OCI_CONTINUE:
        cout << error_point << " Error: OCI_CONTINUE" << endl;
      break;
    default:
        cout << error_point << " Error: UNKNOWN(" << status << ")" << endl;
      break;
  }

  if( ret_code && (envhp != NULL) ) OCIHandleFree(envhp, OCI_HTYPE_ENV);

  return ret_code;

}

附:您可以从 Oracle 文档中获取信息这个示例代码 http://www10.atpages.jp/tymo1914/DB/rdbms/demo/cdemocoll.c.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle OCI、绑定变量和 ID IN (1, 2, 3) 等查询 的相关文章

  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 累计非重复计数

    我正在查询每天获取 uid 的累计不同计数 示例 假设有 2 个 uid 100 200 出现在日期 2016 11 01 并且它们也在第二天出现 新的 uid 300 100 200 300 出现在 2016 11 02 此时我希望商店累
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud

随机推荐

  • javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“Group”)

    unexpected element uri local Group Expected elements are lt group gt 从 xml 解组时遇到异常 JAXBContext jc JAXBContext newInstanc
  • 按边界/坐标单击

    我知道浓缩咖啡有可能以这种方式点击UiAutomator 可以 https stackoverflow com questions 20519905 uiautomator click on a imagebutton with no te
  • Guid.NewGuid() 与 new Guid()

    有什么区别Guid NewGuid and new Guid 哪一个是首选 new Guid 制作一个 空 全0 guid 00000000 0000 0000 0000 000000000000 不是很有用 Guid NewGuid 制作
  • Angular 4 错误:类型“() => any”中缺少属性“includes”

    我在使用 Angular 4 和 Observable 时遇到错误 Users backend src app app component ts 15 55 类型 gt any 不可分配给类型 State 用户 backend src ap
  • D 中的优雅运算符重载

    有一段时间我对 D 运算符重载的方向感到困惑 但现在我意识到这是一个漂亮的系统 如果它只适用于核心类型 int float 等 考虑以下代码 struct Vector float X Y void opOpAssign string op
  • Python 中的集合和列表有什么区别?

    Python 中集合和列表之间的唯一区别是您可以使用并 相交 差 对称差函数来比较两个集合吗 为什么这些函数不能简单地应用于列表 在什么情况下集合比列表更有用 有很大的不同 集合不能包含重复项 集合是无序的 为了查找集合中的元素 需要使用哈
  • 如何动态启用禁用的 ion-tab?

    这应该是非常简单的 但事实并非如此 在我的 html 中 我有 4 个选项卡 其中一个是默认选项卡 另外 3 个是手动禁用离子选项卡 我的选项卡是标准离子模板 静态 选项卡
  • Android中的SQLite全文搜索unicode

    我正在使用 fts 3 或 4 在 SQLite 中创建一个表 CREATE VIRTUAL TABLE Demo1 USING fts3 content TEXT insert into Demo1 values H Thanh Long
  • Facebook 访问令牌

    我有兴趣使用 facebook graph api 传递电子邮件并获取一个人的名字 类似 https graph facebook com email protected cdn cgi l email protection type us
  • qmake 中的编译器范围值

    qmake 提供了几个内置的平台作用域 允许项目文件根据当前平台执行不同的操作 win32 unix 所有平台规格mkspecs目录还可以用于测试各种平台 编译器组合 例如 linux g win32 g win32 msvc2003 但是
  • 带内存的 C++ 宏

    这最初是作为答案发布的C 宏有内存吗 https stackoverflow com questions 2506167 c macros with memory 9455483 9455483 但不知何故我无法编译它 我可能在这里遗漏了一
  • 在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性“outputFile”

    更新到 AS 1 0 RC 1 和插件 0 14 4 后 我在 build gradle 的重命名部分遇到问题 applicationVariants all variant gt def file variant outputFile v
  • Oracle 9i 中字符之间的子字符串

    在以后的版本中我可以使用这个regexp substr SELECT ID regexp substr ID 1 2 DATA 1 regexp substr ID 1 3 DATA 2 FROM employees Table 雇员 ID
  • Python 追加将现有列表替换为 None [重复]

    这个问题在这里已经有答案了 请看一下这个程序 追加函数将列表替换为 None 错误附在下面 class Solution object def isIsomorphic self a b ad bd if len a len b retur
  • integer64 和 Rcpp 兼容性

    在不久的将来 我的包中将需要 64 位整数 我正在研究可行性bit64 https cran r project org web packages bit64 index html包裹 基本上我计划在一个或多个列中data table与in
  • 为什么 Docker Ubuntu 官方镜像在运行/启动时会立即退出?

    据我所知 当主进程退出时 容器也会退出 我的问题是关于其背后的原因 而不是如何让它发挥作用 我当然知道我可以传递参数 it从交互模式开始 Ubuntu 映像将运行 bin bash当它根据镜像 Dockerfile 启动时 bash 进程不
  • 授予特定角色 ALTER 对特定表的访问权限

    我尝试了很多方法都没有成功 但我想做的是 GRANT ALTER ON dbo theTable TO role 如果您还可以在例如之前和之后向我提供一些许可状态 那就太好了 SELECT FROM fn my permissions db
  • 当期望解析器失败时避免抛出期望失败

    当期望解析器失败时 如何避免抛出异常 我有一个规则 function gt x3 lexeme keyword gt gt x3 alnum gt gt symbol gt gt lvalue list gt gt statements g
  • C++ 在编译时创建 BSTR/在编译时将长度插入字符串?

    是否可以使用宏魔法或 TMP 在编译时将长度插入字符串中 例如 const wchar t myString L Hello 我希望缓冲区实际上包含 长度 字符串常量 我正在使用缺少 constexpr 的 MSVC 2010 我认为必须有
  • Oracle OCI、绑定变量和 ID IN (1, 2, 3) 等查询

    简洁版本 我正在寻找以下 Java 技术的 C OCI 改编 其中代码能够将数字数组 数组大小可以变化 绑定到非 PL SQL 中SELECT语句 然后在 a 中使用结果数组WHERE ID IN 风格检查 http rafudb blog