嗨,我们有一个服务器,它具有处理每个传入请求的流程,就像这样:
将C结构请求序列化为字符串(VARCHAR2),并将其作为IN OUT NOCOPY变量发送到Oracle Package1。
在Package1中通过搜索序列化的请求字符串查找值并进行阶段1。
获取序列化的请求字符串并打印phase1结果。
...
将序列化的请求字符串作为IN OUT NOCOPY变量发送到Oracle PackageN。
在PackageN中,通过搜索序列化的请求字符串和处理phaseN来查找值。
获取序列化的请求字符串并打印phaseN结果。
将请求字符串反序列化为struct并生成响应,并将其传递给发送响应函数。
我们的大问题是find variables的成本,它花费了大量的CPU资源,实际上要消耗大量的CPU资源来从字符串中搜索和提取字符串很多次。
我对这个问题的解决方案是创建一个Oracle对象类型,并将所有变量存储在该类型中,然后将其逐个传递给Package1到PackageN,因此获取variableM的方式就像v_obj.variableM而不是搜索字符串。我正在尝试使用Pro C对象功能,本文档Pro C / 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