繁体   English   中英

如何从 C# 中的用户触发器表中获取 trigger_body

[英]How do I get the trigger_body from the user-triggers table in C#

背景:我实际上是在尝试从 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。

任何建议将不胜感激。

dba_|all_|user_triggers触发器的所有者和名称后,最简单的选择通常是使用dbms_metadata包生成 DDL 以创建触发器。 这将是您的前端应该能够使用的CLOB

DBMS_METADATA.GET_DDL('TRIGGER', <<name of trigger>>, <<owner of trigger>> )

不幸的是,Oracle 中的LONG数据类型是一种非常短暂的死胡同数据类型。 它在 Oracle 7 days if memory services 中被引入,并被 8.1.5 弃用,转而使用CLOBBLOB表示已弃用的LONG RAW )。 Oracle 一直建议人们在大约 20 年内不要使用该数据类型。 使用这种数据类型有很多限制。 大多数情况下,它只存在于非常旧的遗留应用程序和添加它的数据字典表中,因为 Oracle 希望确保这些视图的向后兼容性。 今天的大多数前端工具都没有内置对LONG数据类型的支持,因为在 OCI 层,它涉及跳过相当多的环节,您只需跳过这些环节即可使用LONG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM