2016-01-05 518 views
2

我正在清理一堆舊解決方案。作爲清理的一部分,我正在考慮從Oracle數據庫中刪除一些舊的觸發器。觸發器最初是由我的同事設計的,並由第三方顧問設置。我沒有任何直接訪問Oracle數據庫的權限,除非通過我有權訪問的Sql Server中的server link將LONG轉換爲Oracle中的varchar

所以我列出這樣的觸發器:

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

這工作正常,但問題是,從ALL_TRIGGERSTRIGGER_BODYLONG類型,並在現場得到的數據在切斷Oracle服務器和我的SSMS結果集之間的某點。所以我只能看到這個專欄的前100個字符。

如何選擇整個TRIGGER_BODY字段?

回答

3

通過谷歌搜索oracle convert long to varchar給出了不少結果,其中許多建議使用函數,(臨時)表等等。所有這些在我的具體情況中都不存在問題,因爲我不允許創建任何對象在Oracle數據庫/服務器上。

我終於找到了一個能夠修改我的用例的示例。樣本是從this page,有人稱自己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值的演示。真的是一個傑出的答案! –