真是羞愧,用了这么久的pro*c,一直对这两个参数到底是怎么回事一知半解,只是知道code用cpp的时候parse必须用none或者是partial,而且这个时候所有的宿主变量必须在专门的定义部分定义。
这就造成在写cpp代码的时候挺麻烦的,比如要写一个函数,函数中需要将参数传递给oracle做查询使用,结果不行,宿主变量需要重新定义,那就只能重新定义一个新的宿主变量,把参数复制过去,再传递给oracle使用。又麻烦效率又低。有的时候为了绕过这个麻烦,只好定义一些全局变量,避免通过参数传递,全局变量用多了也是问题。
更麻烦的事情还在于一些复杂的表,我们会定义一下宿主结构变量,然而结构的定义也必须放在专门的定义部分,就没办法放在头文件中定义一次供多个文件使用,当然可以在不同的文件中重新定义,只是这样一来结构有调整的时候容易造成不一致。
折腾了好几天不知道怎么办,终于沉下心仔细思考了一下,这才发现了code和parse的真实作用。
原来pro*c虽然叫pro*c/c++,但是oracle在这一块对c++的支持并不好,code=cpp时可能仅仅是对函数原型加上了extern "C"这样的修饰,它解析不了c++的代码,所以识别不了在c++中定义的变量,甚至于在parse=none的时候连头文件都不去读,这就是为什么这种情况下一定要在专门的定义部分定义宿主变量的原因。
知道了原因却发现找不到什么好的解决方案,只好把业务代码全部从c++改成c。