嗨,我们有一个带有流的服务器来处理每个传入的请求,如下所示:
将 C 结构请求序列化为 string(VARCHAR2(,并将其作为 IN out nocopy 变量发送到 Oracle Package1。
在 Package1 中,通过搜索序列化的请求字符串和进程阶段 1 来查找值。
取回序列化的请求字符串并打印阶段 1 结果。
。
将序列化的请求字符串作为 IN out nocopy 变量发送到 Oracle PackageN。
在 PackageN 中,通过搜索序列化的请求字符串和进程阶段 N 来查找值。
取回序列化的请求字符串并打印阶段 N 结果。
将请求字符串反序列化为结构并生成响应并将其传递给发送响应函数。
我们最大的问题是查找变量的成本,它使用大量 CPU 资源,并且实际上消耗整个 CPU 资源来搜索和从字符串中获取字符串很多次。
我对这个问题的解决方案是创建一个 Oracle 对象类型并将所有变量存储在该类型中,并将其逐个传递给 Package1 到 PackageN,因此获取变量 M 就像 v_obj.variableM 而不是搜索字符串一样。我正在尝试使用 Pro C 对象功能,本文档 ProC/C++ 程序员指南 - 第 17 章对象 说使用 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
但是我收到分配,免费并将指向ott生成的结构的指针传递给PLSQL块的proc语义错误,如下所示:
{
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
这篇文章有帮助: OraFAQ: Pro*C 编译错误