Luk*_*zda 8 sql oracle oracle12c
背景:ALL_IND_EXPRESSIONS有专栏
Run Code Online (Sandbox Code Playgroud)COLUMN_EXPRESSION LONG Function-based index expression defining the column
我知道这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变长
备注:
PL/SQL blockDBMS_METADATA.GET_DDL (事实并非如此)是否有可能从投/转换/使用内置函数LONG来VARCHAR2?
EDIT TL; DR:
SELECT column_expression || 'a' -- convert to working code
FROM all_ind_expressions;
Run Code Online (Sandbox Code Playgroud)
您可以使用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)