我可以通过OCI函数获取SID(“ Oracle会话ID”)吗?

时间:2018-08-09 08:38:22

标签: c oracle oci

有一个示例仅使用OCI函数来执行查询。

skip..

  text *sql = (text *)"SELECT empno, ename FROM emp";
  int id;
  text pad[4000];

  strcpy(username, "scott");
  strcpy(password, "tiger");
  strcpy(dbname, "orcl");

  OCIEnvCreate(&env, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
  OCIHandleAlloc(env, (dvoid *)&err, OCI_HTYPE_ERROR, 0, 0);

  if (r = OCILogon2(env, err, &svc, username, strlen(username), password, strlen(password), dbname, strlen(dbname), OCI_DEFAULT) != OCI_SUCCESS)
  {
    checkerr(err, "OCILogon2", r);
  }

  if (r = OCIStmtPrepare2(svc, (OCIStmt **)&stm, err, sql, strlen(sql), NULL, 0, OCI_NTV_SYNTAX, OCI_DEFAULT) != OCI_SUCCESS)
  {
    checkerr(err, "OCIStmtPrepare2", r);
    goto clean_up;
  }

...skip


  if (r = OCIDefineByPos(stm, &def, err, 1, &id, sizeof(id), SQLT_INT, 0, 0, 0, OCI_DEFAULT) != OCI_SUCCESS)
  {
    checkerr(err, "OCIDefineByPos", r);
    goto clean_up;
  }

  if (r = OCIDefineByPos(stm, &def, err, 2, pad, sizeof(pad), SQLT_STR, 0, 0, 0, OCI_DEFAULT) != OCI_SUCCESS)
  {
    checkerr(err, "OCIDefineByPos", r);
    goto clean_up;
  }

  if (r = OCIStmtExecute(svc, stm, err, 0, 0, 0, 0, OCI_DEFAULT) != OCI_SUCCESS)
  {
    checkerr(err, "OCIStmtExecute", r);
    goto clean_up;
  }

...skip

我想获取执行上述查询的会话的SID。

我认为我可以通过“ OCIAttrGet”获得它。 试图找到手册,但失败了...

有办法吗?

1 个答案:

答案 0 :(得分:0)

您可以通过查询获取它:

select unique sid from v$session_connect_info where sid = sys_context('USERENV', 'SID');