Oracle Pro*C 对象类型转换为 C 结构
Oracle Pro*C Object Type Convert To C Structures
嗨,我们有一个服务器,它有一个流程来处理每个传入的请求,它是这样的:
将 C 结构请求序列化为字符串 (VARCHAR2) 并将其作为 IN OUT NOCOPY 变量发送到 Oracle Package1。
在 Package1 中 通过搜索序列化请求字符串 和进程 phase1 来查找值。
取回序列化请求字符串并打印第一阶段结果。
...
将序列化的请求字符串作为 IN OUT NOCOPY 变量发送到 Oracle PackageN。
在 PackageN 中通过搜索序列化请求字符串和进程阶段 N 来查找值。
取回序列化请求字符串并打印阶段 N 结果。
将请求字符串反序列化为结构并生成响应并将其传递给发送响应函数。
我们的大问题是 查找变量 的成本,它使用大量 CPU 资源并且实际上消耗了整个 CPU 资源来搜索和获取字符串字符串很多次。
我对这个问题的解决方案是创建一个 Oracle 对象类型并将所有变量存储在该类型中,然后将它一个一个地传递给 Package1 到 PackageN,因此获取变量 M 就像 v_obj.variableM 而不是搜索字符串。我正在尝试使用 ProC 对象功能,本文档 ProC/C++ Programmer's Guide - Chapter 17 Objects 说使用 OTT 工具生成 C 结构并将其包含在 C 源代码中。
OTT 命令是:
ott intype=autho_row_obj_in.typ hfile=AuthoRowObj.h outtype=autho_row_obj_out.typ code=c userid=scott/tiger
INTYPE 文件是:
CASE=LOWER
TYPE TLV_UTILS.AUTHO_ROW_OBJ AS AuthoRowObj
OTT 命令成功结束并创建头文件
我把这个添加到 pcscfg.cfg:
OBJECTS=YES
intype=autho_row_obj_out.typ
但是我得到 ALLOCATE, FREE 的 proc 语义错误,并将指向 ott 生成的结构的指针传递给 PLSQL 块,如下所示:
{
AuthoRowObj *pRow, AuthoRowObj_ind *pRowInd;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR T_tlv_Data [ 4096];
EXEC SQL END DECLARE SECTION;
EXEC SQL EXECUTE
BEGIN
:pRow:pRowInd := TO_AUTHO_OBJ(:T_tlv_Data);
END;
}
错误是:
PLS-S-00382, expression is of wrong type
此错误与 proc 参数有关:
intype=/src/inc/autho_row_obj_out.typ
这 post 有帮助:OraFAQ: Pro*C compilation error
嗨,我们有一个服务器,它有一个流程来处理每个传入的请求,它是这样的:
将 C 结构请求序列化为字符串 (VARCHAR2) 并将其作为 IN OUT NOCOPY 变量发送到 Oracle Package1。
在 Package1 中 通过搜索序列化请求字符串 和进程 phase1 来查找值。
取回序列化请求字符串并打印第一阶段结果。
...
将序列化的请求字符串作为 IN OUT NOCOPY 变量发送到 Oracle PackageN。
在 PackageN 中通过搜索序列化请求字符串和进程阶段 N 来查找值。
取回序列化请求字符串并打印阶段 N 结果。
将请求字符串反序列化为结构并生成响应并将其传递给发送响应函数。
我们的大问题是 查找变量 的成本,它使用大量 CPU 资源并且实际上消耗了整个 CPU 资源来搜索和获取字符串字符串很多次。
我对这个问题的解决方案是创建一个 Oracle 对象类型并将所有变量存储在该类型中,然后将它一个一个地传递给 Package1 到 PackageN,因此获取变量 M 就像 v_obj.variableM 而不是搜索字符串。我正在尝试使用 ProC 对象功能,本文档 ProC/C++ Programmer's Guide - Chapter 17 Objects 说使用 OTT 工具生成 C 结构并将其包含在 C 源代码中。
OTT 命令是:
ott intype=autho_row_obj_in.typ hfile=AuthoRowObj.h outtype=autho_row_obj_out.typ code=c userid=scott/tiger
INTYPE 文件是:
CASE=LOWER
TYPE TLV_UTILS.AUTHO_ROW_OBJ AS AuthoRowObj
OTT 命令成功结束并创建头文件
我把这个添加到 pcscfg.cfg:
OBJECTS=YES
intype=autho_row_obj_out.typ
但是我得到 ALLOCATE, FREE 的 proc 语义错误,并将指向 ott 生成的结构的指针传递给 PLSQL 块,如下所示:
{
AuthoRowObj *pRow, AuthoRowObj_ind *pRowInd;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR T_tlv_Data [ 4096];
EXEC SQL END DECLARE SECTION;
EXEC SQL EXECUTE
BEGIN
:pRow:pRowInd := TO_AUTHO_OBJ(:T_tlv_Data);
END;
}
错误是:
PLS-S-00382, expression is of wrong type
此错误与 proc 参数有关:
intype=/src/inc/autho_row_obj_out.typ
这 post 有帮助:OraFAQ: Pro*C compilation error