Tag: o oracle

Solaris 10上更好的内存(堆)管理

我通过Pro * C为嵌入式SQL for Oracle提供了c代码。 每当我进行插入或更新时(下面给出更新示例), update TBL1 set COL1 = :v, . . . where rowid = :v 为了管理批量插入和更新,我已经分配了几个内存块作为批量和提交一次插入。 在必要时,还会有其他内存分配。 如何更好地管理动态内存分配的内存(堆)? 一种选择是在GNU链接时间内配置堆大小。 我使用g ++版本2.95,我知道它是一个相当旧的版本,但必须使用它来传统。 由于可执行文件(在solaris 10上运行),obce内置,可以在具有不同资源的多个生产环境上运行,因此用于堆大小分配的单一大小适合可能不合适。 作为替代方案,需要一些机制,其中堆可以在需要时弹性地生长。 与Linux不同,我认为,Solaris没有过度分配内存的概念。 因此,如果没有剩余空间,则内存分配可能会因ENOMEM而失败。 什么可能是更好的策略,知道我们可以跨越危险级别,现在我们应该释放我们正在存储的块,以防这些是使用或传输内存块到oracle DB完成的情况下,如果这些仍然有待加载,最后解除分配。 您可以建议的任何策略?

ORA-01031:插入权限不足

从NUMBER(4)到VARCHAR2(4)的e列的数据类型发生了变化。 DBA完成了现有值的转换。 现在当我们尝试使用proc * c代码将记录插入表中时,它会给出错误“ORA-01031:权限不足”。 从SQLPLUS我们可以插入记录。 一段时间后,问题就消失了。 DBA重建表后问题就消失了。 每次我们使用新更改刷新测试环境后,都会出现此问题。

我应该将哪种数据类型绑定为查询参数以与Oracle ODBC中的NUMBER(15)列一起使用?

我刚刚被SO问题Binding int64(SQL_BIGINT)中描述的问题所困扰,因为查询参数在Oracle 10g ODBC中执行期间会导致错误 。 我正在使用ODBC 2从SQL Server移植到Oracle的C / C ++应用程序。 对于超过NUMBER(9)的数字字段,它使用__int64数据类型,该数据类型作为SQL_C_SBIGINT绑定到查询。 显然,Oracle ODBC不支持这种绑定。 我现在必须进行应用程序范围的转换到另一种方法。 由于我没有太多时间 – 这是一个意想不到的问题 – 我宁愿使用经证实的解决方案,而不是试错。 应该使用什么数据类型来绑定,例如Oracle中的NUMBER(15)? 有记录建议的解决方案吗? 你在用什么? 有什么建议? 我对不需要任何额外转换的解决方案特别感兴趣。 我可以轻松地以__int64或char *的forms提供和使用数字(正常的非指数forms,没有千位分隔符或小数点)。 任何其他格式都需要我的额外转换。 到目前为止我尝试了什么: SQL_C_CHAR 看起来它对我有用。 我担心数字格式的可变性。 但在我的用例中它似乎并不重要。 显然只有分数点字符随系统语言设置而变化。 我不明白为什么我应该在SQL INSERT或UPDATE命令中使用显式强制转换(例如TO_NUMERIC)。 当我将参数与SQL_C_CHAR作为C类型绑定并且SQL_NUMERIC(具有适当的精度和比例)作为SQL类型绑定时,一切正常。 我无法重现任何数据损坏效果。 SQL_NUMERIC_STRUCT 我注意到SQL_NUMERIC_STRUCT添加了ODBC 3.0并决定尝试一下。 我很失望。 在我的情况下,这已经足够了,因为应用程序并不真正使用小数。 但作为一般解决方案……简单地说,我不明白。 我的意思是,我终于理解了应该如何使用它。 我没有得到的是: 为什么有人会引入这种新结构,然后以这种方式工作 。 SQL_NUMERIC_STRUCT具有表示任何NUMERIC(或NUMBER或DECIMAL)值及其精度和比例所需的所有字段。 只有它们不被使用。 在读取时,ODBC设置数字的精度(基于列的精度;除了Oracle返回更高的精度,例如对于NUMBER(15)为20)。 但是,如果您的列具有小数部分(比例> 0),则默认情况下将其截断。 要以适当的比例读取数字,您需要在获取数据之前使用SQLSetDescField调用设置精度并自行调整。 在编写时,Oracle非常感谢尊重SQL_NUMERIC_STRUCT中包含的规模。 […]

通过C连接到oracle DB

我想在Windows操作系统中使用C语言连接到oracle数据库。 但我不知道如何从它开始,先决条件是什么? 任何人可以提供任何帮助或tutotial或示例代码? 谢谢。