Oracle中定义大对象的新方式(oracle中定义大对象)
Oracle中定义大对象的新方式
在过去的Oracle数据库版本中,大对象(LOB)是通过使用BLOB,CLOB或NCLOB数据类型来存储二进制,字符或Unicode数据的。然而,Oracle 12c版本中引入了一种新的方式来定义大对象类型,即“SecureFile LOBs”。
SecureFile LOBs 不仅遵循所有LOB的标准特性,还引入了新特性,包括压缩、加密和现代化存储结构,例如字节地址和块地址。由于这些新特性,使用SecureFile LOBs能够显著提高大对象性能,并降低存储资源的使用。
下面介绍如何在Oracle 12c及以上版本数据库中使用SecureFile LOBs。
定义SecureFile LOB
当声明一个SecureFile LOB时,必须指明它是一个BLOB、CLOB、NCLOB类型。如下所示,在创建表时使用SECUREFILE LOB限定符声明BLOB类型的SecureFile LOB:
“` sql
CREATE TABLE Example_Table (ID NUMBER, Secure_File BLOB
LOB(SecureFile) STORE AS SECUREFILE (TABLESPACE example_ts))
在这里,Secure_File列被定义为BLOB,插入行时的值将存储为SecureFile LOB类型。SECUREFILE LOB限定符告诉Oracle将列定义为SecureFile LOB类型并使用TableSpace example_ts存储表。
当SecureFile LOB存储在新的TableSpace时,可以在创建表时定义TableSpace选项。如果该选项未指定,则LOB将存储在表所在的TableSpace中。
插入SecureFile LOB
SecureFile LOB可以通过多种方式插入,以下展示其中两种。
最常用的方法是使用INSERT语句将值插入 SecureFile LOB。例如:
``` sqlINSERT INTO Example_Table (ID, Secure_File) VALUES (1, EMPTY_BLOB());
SELECT Secure_File FROM Example_Table WHERE ID = 1 FOR UPDATE;
UPDATE Example_Table SET Secure_File = LOAD_FROM_FILE('C:\Example_File.txt') WHERE ID = 1;
COMMIT;
使用INSERT语句创建一个新行。值被初始化为空值(EMPTY_BLOB()),但必须先select for update以锁定行并准备更新操作。然后,使用LOAD_FROM_FILE函数从文件中加载二进制数据并提供其完整路径或可命名数据流来更新LOB。将更改提交。
另一种插入SecureFile LOB的方法是使用DBMS_LOB包的APPEND函数。例如:
“` sql
DECLARE
v_lob_data BLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_lob_data, TRUE);
DBMS_LOB.APPEND(v_lob_data, HEXTORAW(‘F190’));
DBMS_LOB.APPEND(v_lob_data, HEXTORAW(‘FC9031’));
INSERT INTO Example_Table (ID, Secure_File)
VALUES (2, v_lob_data);
END;
这种方法首先创建一个临时LOB,使用APPEND函数将二进制数据添加到该LOB中。然后,在INSERT语句中将LOB插入表。临时LOB将在会话结束时被自动删除。
查询SecureFile LOB
可以使用SELECT语句检索SecureFile LOB值。但必须使用DBMS_LOB.GETLENGTH和DBMS_LOB.READ函数指定LOB读取的起始位置和需要的字节数。例如:
``` sqlDECLARE
v_lob_data BLOB; v_offset INTEGER := 1;
v_amount INTEGER;BEGIN
SELECT Secure_File INTO v_lob_data FROM Example_Table WHERE ID = 2;
v_amount := DBMS_LOB.GETLENGTH(v_lob_data);
DBMS_OUTPUT.PUT_LINE('LOB length: ' || v_amount);
WHILE v_offset LOOP
DBMS_LOB.READ(v_lob_data, v_amount - v_offset, v_offset, v_buffer); DBMS_OUTPUT.PUT_LINE('LOB chunk: ' || RAWTOHEX(v_buffer));
v_offset := v_offset + v_amount; END LOOP;
END;
在SELECT语句中检索SecureFile LOB值,使用DBMS_LOB.GETLENGTH函数获取LOB长度。在循环中,使用DBMS_LOB.READ函数读取LOB数据,并使用DBMS_OUTPUT.PUT_LINE函数将其输出。虽然不是必需的,但在循环中使用缓冲变量是一种最佳实践。
删除SecureFile LOB值
使用DELETE语句删除行时,SecureFile LOB值也将被删除。但是,LOB在TABLE中存在时是无法直接删除的。这可以通过使用DBMS_LOB包中的EMPTY函数来完成,如以下示例所示:
“` sql
DECLARE
v_lob_data BLOB;
BEGIN
SELECT Secure_File INTO v_lob_data FROM Example_Table WHERE ID = 2 FOR UPDATE;
DBMS_LOB.EMPTY_LOB(v_lob_data);
COMMIT;
END;
在SELECT语句中选择LOB值并使用FOR UPDATE在行上锁定以保证别的会话不会修改它。然后,使用DBMS_LOB.EMPTY_LOB函数清空LOB数据。需要提交更改。
结论
SecureFile LOB是在Oracle 12c版本中引入的新型大对象类型,可以大大提高大对象的性能并降低存储资源的使用。要定义SecureFile LOB,必须指定SecureFile LOB类型并选择使用哪个TableSpace存储它们。插入SecureFile LOB可以使用INSERT语句或DBMS_LOB包的APPEND函数。查询SecureFile LOB时需要使用DBMS_LOB.GETLENGTH和DBMS_LOB.READ函数。SecureFile LOB值可以通过使用DELETE语句和DBMS_LOB.EMPTY_LOB函数删除。