如何将LONG转换为内联的VARCHAR2

Luk*_*zda 8 sql oracle oracle12c

背景:ALL_IND_EXPRESSIONS有专栏

COLUMN_EXPRESSION   LONG   Function-based index expression defining the column
Run Code Online (Sandbox Code Playgroud)

我知道这LONG已被弃用了.我需要编写类似的东西(或做其他文本操作):

SELECT 
  REPLACE(REPLACE(REPLACE(
    q'{ALTER INDEX "<index_owner>"."<index_name>" ON ... (<column_expression>)}'
   ,'<index_owner>', index_owner )
   ,'<index_name>', index_name) 
   ,'<column_expression>', column_expression) AS result
FROM all_ind_expressions;
Run Code Online (Sandbox Code Playgroud)

ORA-00932:不一致的数据类型:预期NUMBER变长

DBFiddle演示

备注:

  • 它必须是自包含的查询
  • 没有中间对象(创建表/视图不是一个选项).
  • 没有 PL/SQL block
  • DBMS_METADATA.GET_DDL (事实并非如此)
  • WITH FUNCTION子句作为最后的手段

是否有可能从投/转换/使用内置函数LONGVARCHAR2

EDIT TL; DR:

SELECT column_expression || 'a'  -- convert to working code
FROM all_ind_expressions;
Run Code Online (Sandbox Code Playgroud)

Dr *_*Wit 7

您可以使用XML,除非表达式包含可以强制解析XML的内容.

select *
  from xmltable(
          '/ROWSET/ROW'
          passing (select dbms_xmlgen.getxmltype('select * from all_ind_expressions
                                                   where index_name = ''XDB$COMPLEX_TYPE_AK''')
                     from dual)
          columns index_owner varchar2(30) path 'INDEX_OWNER',
                  index_name varchar2(30) path 'INDEX_NAME',
                  table_owner varchar2(30) path 'TABLE_OWNER',
                  table_name varchar2(30) path 'TABLE_NAME',
                  column_expression varchar2(4000) path 'COLUMN_EXPRESSION')

INDEX_OWNER     INDEX_NAME           TABLE_OWNER     TABLE_NAME           COLUMN_EXPRESSION                  
--------------- -------------------- --------------- -------------------- -----------------------------------
XDB             XDB$COMPLEX_TYPE_AK  XDB             XDB$COMPLEX_TYPE     SYS_OP_R2O("XMLDATA"."ALL_KID")    
1 row selected.
Run Code Online (Sandbox Code Playgroud)