我有一个表t,列c是LONG类型的,我想提取最后100个字符。
困难在于:
1.字符串函数不适用于LONG。
1.很难将LONG转换为CLOB,甚至to_lob和cast似乎也会失败
1.这些值可以超过VARCHAR的长度。
我尝试了最明显的解决方案:
select right(to_lob(c), 100) from t
字符串
它失败了,
不一致的数据库:预期的CHAR得到了LONG
还有慢性创伤性脑水肿
with foo as (
select cast(to_lob(c) as clob) c
)
select substr(c, length(c)-99, 100) ending
from foo
型
这会产生同样的错误。
2条答案
按热度按时间hwamh0ep1#
如果你的长值大小小于32 KB,你可以简单地将它们分配给PL/SQL中的一个本地
varchar2
变量。如果它们小于4KB,这特别容易,因为我们可以返回一个SQL可以访问的varchar2
。它可能是这样的:字符串
如果值大于4KB,则需要让函数本身获取字符串的结尾。如果值大于32 KB,那么你就必须使用一个更复杂的方法,包括
dbms_sql
,通过迭代dbms_sql.column_value_long
调用来逐步读取long,并追加到一个临时CLOB。这要复杂得多。这就是为什么我们从不使用long数据类型。关于它的唯一位置,应该在Oracle的数据字典中的某些视图中找到,并且可以使用上述技术使这些视图可通过代码进行管理。s8vozzvw2#
尝试
字符串
如果表中有PK,则LIST_OF_COLUMNS_LEADING_TO_UNIQUE_ROW是平凡的。
示例如下:
型