背景:我实际上是在尝试从C#程序中识别Oracle表中的自动增量列。我已经发现在Oracle自动增量中使用序列和触发器完成,并使用SQL Developer在示例数据库中识别了序列和触发器。
所以,下一步,获取触发器:我可以使用查询 - "从USER_TRIGGERS"中选择*。没问题。甚至还有一个TABLE_NAME字段来检查我要检查的表。 (还有一个COLUMN_NAME列可能很有用,但似乎总是空的。)
现在似乎别无选择,只能解析TRIGGER_BODY字段 - 但还有其他问题。 SQL Developer向我显示TRIGGER_BODY中有一个看起来很有意义的字符串,但在我的DataTable中,从查询中返回,TRIGGER_BODY字段始终为空。
我在网上搜索过,看来TRIGGER_BODY实际上是LONG,虽然C#表示该列是字符串类型,所以我不明白。到目前为止,我发现的唯一建议是使用TO_LOB()(或可能的TO_CLOB())函数以某种方式转换字段的内容,但这只会引发一个"不一致的数据类型"异常。
我使用C#4.5和Oracle.DataAccess作为数据访问对象。 Oracle版本为11g。
我们将非常感激地收到任何建议。
答案 0 :(得分:1)
从dba_|all_|user_triggers
获得触发器的所有者和名称后,最简单的选择通常是使用dbms_metadata
程序包生成DDL以创建触发器。这将是您的前端应该能够使用的CLOB
。
DBMS_METADATA.GET_DDL('TRIGGER', <<name of trigger>>, <<owner of trigger>> )
不幸的是,Oracle中的LONG
数据类型是一种非常短暂的死胡同数据类型。如果内存服务在Oracle 7天中引入了一段时间,并且被8.1.5取消,而支持CLOB
(BLOB
用于被删除的LONG RAW
)。甲骨文一直建议人们不要使用这种数据类型大约20年。使用此数据类型有很多限制。在大多数情况下,它只存在于非常古老的遗留应用程序和添加它的数据字典表中,因为Oracle希望确保这些视图的向后兼容性。今天的大多数前端工具都没有构建对LONG
数据类型的支持,因为在OCI层它涉及跳过很多箍,你只需跳过它来使用LONG
。< / p>