Noob在这里(关于Oracle和OCI).
我正在编写一个程序来为我的公司做一些任务.在这些任务中,我必须更新oracle数据库以使其与其他操作保持同步.
我想有效地预分配内存以保存在选择集上获取的结果.为了做到这一点,我需要知道选择集中有多少行.
我可以用2个单独的陈述来做;首先是SELECT COUNT语句,后跟SELECT语句,但从服务器的角度来看效率很低.我也可以执行我的SELECT语句并在从选择集中获取行时动态分配内存,但从客户端的角度来看这是低效的.
我想简单地执行SELECT语句,并在获取任何行之前,检索选择集中匹配行的数量.
但我找不到具有此信息的属性.
有OCI_ATTR_ROW_COUNT但这是FETCHED的行数,而不是选择集中的总行数.
然后有OCI_ATTR_PARAM_COUNT,告诉你COLUMNS的数量(似乎没用,因为你已经知道你在sql中要求的列数).
谢谢
玩笑
解决方法
你不能. Oracle数据库通常不知道查询在获取最后一行之前将返回多少行.
通常,客户端将被设计为从客户端获取特别大小的批量数据,处理这些结果,然后获取下一批数据.例如,大多数PL / sql GUI应用程序(TOAD,sql Developer等)将执行查询,获取第一批50或100行,然后等待用户.当用户浏览数据时,客户端将获取下一批,处理该批处理并迭代直到最后一批被使用.您是否可以从内存中丢弃先前的批次,或者是否需要保留它们(以支持用户向后滚动的能力,例如,无需重新执行查询)是您的应用程序需要确定的内容.
当你担心在客户端上动态分配内存时,你担心什么效率低下?这通常是最有效的做事方式.假设您选择合理的批量大小,您将在客户端上请求合理大小的内存块(每个批处理一次或一次,具体取决于您是否需要在本地缓存数据),这非常有效.