我的表包含一个CLOB
字段,其长度可以超过32767个字节或字符。这意味着,如果我想从此CLOB
字段中提取所有字符,则必须将CLOB
分成块,并将每个块作为SELECT
查询语句中的不同列进行传递。如何在SELECT语句中动态添加列名(Oracle)
所以我有这个疑问:
SELECT dbms_lob.Substr(clob_field, dbms_lob.Getlength(clob_field), 1) AS data
FROM some_table
如果clob_field
太大这是行不通的。我的想法是制作长度为2000的块,并且对于每个块,在SELECT
声明中添加一列。
理念的概念:
var a = 1
var b = 2000
chunkAmountList = 1+(dbms_lob.Getlength(clob_field) mod 2000)
statement = "SELECT "
BEGIN
for chunk in chunkAmountList
statement = statement + "dbms_lob.Substr(clob_field, b, a) as data"
a = a + 2000
b = b + 2000
endloop
END
statement = statement + "FROM some_table"
statement.execute()
这将导致相同名称不同的列(这是我想要的)。所以,如果clob_field具有5000的长度,我想这是一个结果:
data data data
---- ---- ----
"first 2000 chars" "second 2000 chars" "last 1000 chars"
我想这样做在Oracle中,但不知道怎么样。任何帮助真的很感激。谢谢!
我会使用2048个字符而不是2000;它更适合于32767.对于每个“块”的字符串都有一个新的行,这也是比较正常的。然后你可以用一个连接来代替动态SQL。 *(创建一个16行,其中的值为1到16的表,加入这个行并选择行的id和第n个2048个字符。)*然后,您也只需要返回具有值的行,而不是可能会返回16个字段,其中一些字段为空。是否有一个原因,它必须分裂到多个*领域*? – MatBailie
你提取所有数据的目的是什么?有人肯定会读它吗?他们用什么方法访问数据库?一些描述的呈现网站,或者他们直接用SQL * Plus之类的东西来读取它。 – Ben
您是否知道CLOB可能包含几个TBytes?数字ob列不得超过1000,这不适合。 –