테이블에 길이가 32767 바이트 또는 문자 이상인 CLOB
필드가 있습니다. 즉, CLOB
필드에서 모든 문자를 추출하려면 CLOB
을 청크로 분할하고 각 청크를 SELECT
쿼리 문에 다른 열로 전달해야합니다. clob_field
가 너무 큰 경우select 문에 동적으로 열 이름을 추가하는 방법 (Oracle)
SELECT dbms_lob.Substr(clob_field, dbms_lob.Getlength(clob_field), 1) AS data
FROM some_table
이 작동하지 않습니다 :
그래서 나는이 쿼리가 있습니다. 내 생각은 길이가 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"
을 나는 오라클에서이 작업을 수행하기를 원하지만 방법은 모르겠어요. 어떤 도움이라도 대단히 감사합니다. 감사!
2000 대신 2048자를 사용합니다. 그것은 32767에 더 깔끔하게 맞습니다. 문자열의 각 "조각"에 대해 새로운 행을 갖는 것이 더 일반적입니다. 그런 다음 동적 SQL 대신 결합을 사용하여이를 수행 할 수 있습니다. * (값이 1에서 16까지 인 16 개 행의 테이블을 만들고 거기에 조인하고 행 ID와 n 번째 2048 문자를 선택하십시오.) * 다음으로 값이있는 행을 반환하면됩니다. 일부는 비어있는 16 개의 필드를 잠재적으로 반환합니다. 여러 개의 필드 *로 분할해야하는 이유가 있습니까? – MatBailie
모든 데이터를 추출하는 목적은 무엇입니까? 누군가 그것을 확실히 읽을 것입니까? 데이터베이스에 액세스하기 위해 어떤 방법을 사용합니까? 일부 설명의 렌더링 된 사이트 또는 SQL * Plus와 같은 것으로 직접 읽고 있습니다. – Ben
CLOB에 몇 TBytes가 포함될 수 있다는 사실을 알고 있습니까? 숫자 ob 열은 1000을 초과하면 안되며 적합하지 않습니다. –