获取 Oracle CLOB 列中的最后一个字符

Getting the last character in an Oracle CLOB column

我在从 Oracle CLOB 列获取最后一个字符时遇到问题。适用于 VARCHAR 列的相同 SQL 不适用于 CLOB 列,并且无法弄清楚为什么或如何使其工作。

(这适用于从 VARCHAR 中获取最后一个字符)

select substr(COLUMN_NAME, length(COLUMN_NAME), 1) 来自 TABLE_NAME

(应用于 CLOB 列时,它不会 return 最后一个字符。

select substr(CLOB_COLUMN, length(CLOB_COLUMN), 1) 来自 TABLE_NAME

(更新如下) 根据 Alex 的建议,我为该列添加了 dump/cast 并得到“Typ=1 Len=1: 10”。 (我不知道那是什么)

这是 SQL 我是 运行:

set linesize 32000

select 
length(COLUMN_NAME) as clob_length, 
substr(trim(COLUMN_NAME), length(trim(COLUMN_NAME)) -50 ) as last_50,
SUBSTR(COLUMN_NAME, -1) as last_char,
dump(cast(substr(COLUMN_NAME, -1) as varchar2(1)))
from TABLENAME

我添加了我使用的 SQL,其中一行的结果是:

CLOB_LENGTH: 1227 
LAST_50: shall be permitted to be continued in service 
LAST_CHAR: 
VARCHAR2(1): Typ=1 Len=1: 10 

(我不清楚最后一个值是什么意思)

适用于我的简单测试用例:

SQL> create table test (col clob);

Table created.

SQL> insert into test (col) values ('This is a cloB');

1 row created.

SQL> select substr(col, length(col), 1) from test;

SUBSTR(COL,LENGTH(COL),1)
--------------------------------------------------------------------------------
B

不过,使用substr(col, -1)更简单(取最后一个字符):

SQL> select substr(col, -1) from test;

SUBSTR(COL,-1)
--------------------------------------------------------------------------------
B
   
SQL>

I added the dump/cast and get "Typ=1 Len=1: 10" for that column

正如 your image 怀疑的那样,您的 CLOB 值以新行结尾(字符 10,这是转储输出显示的内容),可能还有其他空格,或者换行符(字符 13),如果原始数据来自,比如说,Word。这就是 'last 50' 没有显示 50 个 'normal' 字符的原因 - 多个空行占据了其中一些位置。

如果您想忽略所有这些尾随字符,您可以更改 trim 以包含更多字符,并将其应用于两个 substr 调用;类似于:

substr(rtrim(clob_column, chr(32)||chr(9)||chr(10)||chr(13)), -1)

这将删除空格、制表符、换行符和换行符的任意组合。

db<>fiddle 显示 50 个字符的版本现在显示为单行,最后一个字符为空、'.'、'n'、'e' 等