游标支持
OCIStmtFetch2接口调用支持游标操作,可以分为可滚动和不可滚动两种。如果想要进行游标操作,在调用OCIStmtExecute接口时需要使用OCI_STMT_SCROLLABLE_READONLY模式。
不可滚动是指只能往后读取,并且只有下面参数有效:
- OCI_DEFAULT:具有与OCI_FETCH_NEXT相同的效果。
- OCI_FETCH_NEXT:从当前位置获取下一行。
可滚动是指前后都能读取参数,下列参数有效。
- OCI_FETCH_CURRENT :获取当前行。
- OCI_FETCH_FIRST:获取结果集中的第一行。
- OCI_FETCH_LAST:获取结果集中的最后一行。
- OCI_FETCH_PRIOR:将结果集定位在结果集中当前行的前一行。用户可以使用此模式从“前一行”中提取多行。
- OCI_FETCH_ABSOLUTE:使用绝对定位获取结果集中的行号。
OCI_FETCH_RELATIVE:使用相对定位获取结果集中的行号。
//测试获取 SQL 生成的结果集中的行集 printf("OCI_FETCH_ABSOLUTE 5\n"); int ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_ABSOLUTE, 5, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_PRIOR 0\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_PRIOR, 0, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_RELATIVE 3\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_RELATIVE, 3, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_RELATIVE -1\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_RELATIVE, -1, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_NEXT 0\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, 0, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_DEFAULT 0\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_DEFAULT, 0, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_CURRENT 0\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_CURRENT, 0, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_LAST 0\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_LAST, 0, 0); test_print(stmthp, errhp, c1, c2, c3, ret); printf("\nOCI_FETCH_FIRST 0\n"); ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_FIRST, 0, 0); test_print(stmthp, errhp, c1, c2, c3, ret);