背景:ALL_IND_EXPRESSIONS
有列
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;
ORA-00932:不一致的数据类型:预期的数字得到了长
备注:
- 它必须是自包含查询
- 没有中间对象(创建表/视图不是一个选项)。
- 无
PL/SQL block
DBMS_METADATA.GET_DDL
(实际情况并非如此)- WITH FUNCTION子句作为最后手段
是否可以将内置函数从LONG
转换为VARCHAR2
?
编辑TL;DR:
SELECT column_expression || 'a' -- convert to working code
FROM all_ind_expressions;
4条答案
按热度按时间hts6caw31#
您可以使用XML,除非表达式包含可能阻碍XML解析的内容。
44u64gxh2#
使用
WITH FUNCTION
和Converting Long to Varchar2的方法,但它仍然有点丑陋和过于复杂。查询:
db<>fiddle demo
我相信应该有更优雅的方式来实现它。
t5fffqht3#
正如OracleMaven自己所说,由于遗留原因,不可能将SUBSTR a LONG内联到VARCHAR2。AskTom link。
在这个other link上,你会找到方法用一个过程甚至一个函数来完成它,如果LONG比32k LONG短的话。
这个函数可以在以后的SELECT查询中调用,这是您可能想要实现的。
g2ieeal74#
处理long的最好方法是:1)创建一个LOB类型的临时表(例如2)使用oracle唯一允许的语法:“TO_LOB将long_column列中的LONG或LONG RAW值转换为LOB值。您只能将此函数应用于LONG或LONGRAW列,并且只能应用于INSERT语句中的子查询的选择列表中。”3)利用临时表来完成您的工作