2011-07-04 29 views
9

Tôi cần nối thêm dữ liệu vào trường BLOB, làm cách nào để thực hiện điều này bằng lệnh UPDATE? Điều tôi đang hỏi là; là nó có thể nối dữ liệu blob để tôi cuối cùng có thể đặt nó vào một lĩnh vực như CẬP NHẬT BLOB_table SET BLOB_field = BLOB_field + BLOB_dataLàm cách nào để nối/nối dữ liệu BLOB vào cột BLOB bằng lệnh SQL UPDATE trong ORACLE

tôi đã cố gắng sử dụng DBMS_LOB.APPEND nhưng nó không trả về giá trị; vì vậy tôi đã tạo ra một chức năng mà mang lại cho tôi một lỗi của "LOB không hợp lệ locator quy định"

CREATE OR REPLACE FUNCTION MAKESS.CONCAT_BLOB(A in BLOB,B in BLOB) RETURN BLOB IS 
C BLOB; 
BEGIN 
DBMS_LOB.APPEND(c,A); 
DBMS_LOB.APPEND(c,B); 
RETURN c; 
END; 
/

Trả lời

15

Bạn cần phải tạo một blob tạm thời với DBMS_LOB.createtemporary:

SQL> CREATE OR REPLACE FUNCTION CONCAT_BLOB(A IN BLOB, B IN BLOB) RETURN BLOB IS 
    2  C BLOB; 
    3 BEGIN 
    4  dbms_lob.createtemporary(c, TRUE); 
    5  DBMS_LOB.APPEND(c, A); 
    6  DBMS_LOB.APPEND(c, B); 
    7  RETURN c; 
    8 END; 
    9/

Function created 

Sau đó, bạn sẽ có thể sử dụng nó trong một báo cáo cập nhật:

SQL> CREATE TABLE t (a BLOB, b BLOB, c BLOB); 

Table created 

SQL> INSERT INTO t VALUES 
    2  (utl_raw.cast_to_raw('aaa'), utl_raw.cast_to_raw('bbb'), NULL); 

1 row inserted 

SQL> UPDATE t SET c=CONCAT_BLOB(a,b); 

1 row updated 

SQL> SELECT utl_raw.cast_to_varchar2(a), 
    2   utl_raw.cast_to_varchar2(b), 
    3   utl_raw.cast_to_varchar2(c) 
    4 FROM t; 

UTL_RAW.CAST_TO_VARCHAR2(A UTL_RAW.CAST_TO_VARCHAR2(B UTL_RAW.CAST_TO_VARCHAR2(C 
-------------------------- -------------------------- -------------------------- 
aaa      bbb      aaabbb 
3

với sự giúp đỡ của blob PL/SQL có thể được cập nhật tại chỗ mà không cần cho chức năng tùy chỉnh ở tất cả:

BEGIN 
    FOR c IN (select a, b from t where a is not null for update) LOOP 
     DBMS_LOB.APPEND(c.a, c.b); 
    END LOOP; 
END; 
/
Các vấn đề liên quan