1

我有一些使用以下结构的遗留 Pro*C 代码。
这种模式可以在在线论坛上找到,但在 Oracle 文档中没有。
特别是,谷歌在甲骨文网站上找不到任何关于“sqhsts”的文档

这种模式是否记录在某处?
它被认为是一种好的编程习惯吗?

/* cud (compilation unit data) array */
static const short sqlcud0[] =
{10,4130,832,0,0,
5,0,0,1,0,0,27,23,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0,
36,0,0,2,30,0,4,25,0,0,1,0,0,1,0,2,97,0,0,
};

/* EXEC SQL CONNECT :user IDENTIFIED BY :pwd USING :url; */ 

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )5;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)user;
sqlstm.sqhstl[0] = (unsigned int )0;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = ( void *)pwd;
sqlstm.sqhstl[1] = (unsigned int )0;
sqlstm.sqhsts[1] = ( int )0;
sqlstm.sqindv[1] = ( void *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned int )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqhstv[2] = ( void *)url;

(从这里复制的代码,但与我的相似)

4

1 回答 1

6

Pro*C 从以下语句创建低级 C

EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;

它会为您声明的每个数据项创建类似 OCI 的描述符。EXEC SQL ...;使用这些绑定变量嵌入 sql 的其他语句 ( ) 然后使用在声明部分中编码的内容转换为较低级别的调用系列。Pro*C 已经过时了。25 多年前,我参与了 Pro*C 的第一个测试版。...不建议。

Pro*C 预编译生成的代码在由现代编译器编译并启用警告时并不总是完美。它也不意味着可读。如果您想学习 OCI 编程,您可以了解正在发生的事情。也不是很推荐,除非你想做一些特殊的任务。

示例任务:OCI 用于为 Oracle 创建外部 C/C++ 库。它几乎可以让您以细粒度的方式处理几乎所有您想在 oracle 中执行的操作。从这里开始:

http://www.oracle.com/technetwork/database/features/oci/index.html

于 2012-02-20T04:53:55.097 回答