【发布时间】:2020-09-02 14:36:03
【问题描述】:
嗨,我们有一个服务器,它有一个流程来处理每个传入的请求,如下所示:
将 C 结构请求序列化为 string(VARCHAR2) 并将其作为 IN OUT NOCOPY 变量发送到 Oracle Package1。
在Package1中通过序列化的请求字符串查找值并处理phase1。
取回序列化的请求字符串并打印阶段1结果。
...
将序列化的请求字符串作为 IN OUT NOCOPY 变量发送到 Oracle PackageN。
在PackageN中通过搜索序列化的请求字符串和处理阶段N来查找值。
取回序列化的请求字符串并打印阶段N结果。
将请求字符串反序列化为结构并生成响应并将其传递给发送响应函数。
我们的大问题是查找变量的成本,它使用了大量的 CPU 资源并且实际上消耗了整个 CPU 资源来从字符串中搜索和获取字符串很多次。
我对这个问题的解决方案是创建一个 Oracle 对象类型并将所有变量存储在该类型中,并将其一一传递给 Package1 到 PackageN,因此获取 variableM 为 v_obj.variableM 而不是搜索字符串。我正在尝试使用 ProC 对象功能,此文档 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
但我得到 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
【问题讨论】:
标签: oracle stored-procedures plsql proc oracle-pro-c