在Oracle中将LONG转换为varchar

3

我正在清理一些旧解决方案。作为清理的一部分,我考虑从一个Oracle数据库中删除一些旧触发器。这些触发器最初由我的同事设计,并由第三方顾问实施。我没有直接访问Oracle数据库的权限,只能通过Sql Server上的“服务器链接”进行访问。

因此,我会按照以下方式列出触发器:

select * from openquery(SERVERLINKNAME, '
    select *
    from ALL_TRIGGERS
    where owner like ''%OURUSERNAME%''
    order by trigger_name
')

这个方法可以正常工作,但问题是ALL_TRIGGERS表中的TRIGGER_BODY字段是LONG类型,并且该字段中的数据在Oracle服务器和我的SSMS结果集之间的某些位置被截断了。因此,我只能看到此列的前100个字符。

如何选择整个TRIGGER_BODY字段?

2个回答

4
通过在Google中搜索oracle convert long to varchar,可以得到很多结果,其中许多建议使用函数、(临时)表等。但在我的特定情况下,这些都不可行,因为我不被允许在Oracle数据库/服务器中创建任何对象。
最终,我找到了一个示例,可以修改并用于我的用例。该示例来自此页面,作者自称是Sayan Malakshinov。在修改他的示例后,我得到了以下内容:
select * from openquery(SERVERLINKNAME, '
    select *
    from
    xmltable( ''/ROWSET/ROW'' passing dbms_xmlgen.getXMLType(''
        select
            trigger_name,
            TRIGGER_BODY
        from ALL_TRIGGERS
        where TRIGGER_BODY is not null
            and owner = ''''OURUSERNAME''''
    '')
    columns
        trigger_name varchar2(80),
        TRIGGER_BODY varchar2(4000)
    )
')

这会从ALL_TRIGGERS省略一些列,但我获取整个触发器体(因为没有任何触发器超过4000个字符)。

1
这是我第一次看到一种在不使用PL/SQL的情况下提取LONG值的演示。真是一个杰出的答案! - Bob Jarvis - Слава Україні
这个方法以及其他三种方法的非常详细的解释在这里:http://www.oracle-developer.net/display.php?id=430 - nuiun

1

如果您希望阅读和执行其中一部分更加容易,我将用户1429080的版本进行了转换,使用文字转义语法 使用§和[ / ] 转义嵌套字符串:

select * from openquery(SERVERLINKNAME, q'§   
    select *
    from
    xmltable( '/ROWSET/ROW' passing dbms_xmlgen.getXMLType(q'[
        select
            trigger_name,
            TRIGGER_BODY
        from ALL_TRIGGERS
        where TRIGGER_BODY is not null
            and owner = 'OURUSERNAME'
    ]')
    columns
        trigger_name varchar2(80),
        TRIGGER_BODY varchar2(4000)
    )
§')

如果您想检查 SQL 结果视图中的代码(通常只支持显示单个 CHR(13) 作为可视换行符),这非常有用:

(译注:原文中的 visual line feeds 可以翻译成“可视换行符”)

select  translate( trigger_body, CHR(10)||CHR(13), CHR(13)||CHR(13) ) as body
from xmltable( 
  '/ROWSET/ROW' passing dbms_xmlgen.getXMLType(
    q'[
      select TRIGGER_BODY from ALL_TRIGGERS
      where TRIGGER_NAME='<MY_TRIG_NAME>'  -- or any other condition
    ]')
  columns TRIGGER_BODY varchar2(4000))

我想了解更多关于 q'§ 的内容。你有相关阅读材料的链接吗? - user1429080
请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本:例如,参见 Oracle 12c 文档中此部分的示例:https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00218 ... q'! name LIKE'%DBMS_%%'!', q' <'So,' she said, 'It's finished.'>', q'{SELECT * FROM employees WHERE last_name ='Smith';}', nq'ï Ÿ1234 ï', q'"name like '['"' - Andreas Covidiot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接