oracle存儲二進制
① 「ORACLE」中有哪些數據類型
Oracle中的數據類型有:字元型、數字型、日期型等。具體介紹如下:
1、字元型:char(n):用於標識固定長度的字元串。
當實際數據不足定義長度時,使用空格補全右邊不足位。varchar(n):可變字元串類型。
為sql標准規定的,資料庫必須實現的數據據類型。可以存儲空字元串。
varchar2(n):可變字元串類型,是oracle在varchar的基礎上自行定義的可變長度字元串
類型。當做為列類型使用時,最大長度可被定義為4000;當做為變數類型使用時,長度
可被定義為32767。不可以存儲空字元串。
2、數值型:可用於存儲整數、浮點數。
number(m,n):m表示有效數字的總位數(最大為38位),n表示小 數位數。
3、日期時間型:
date:包含Year(年)、Month(月) 、Day(天)、Hour(時)、Minutes(分)、Second(秒)
說明:(yyyy表示4位年分;mm表示月份;dd表示天;hh表示時;mi表示分;ss表示秒)
4、大對象類型:lob:用於存儲大對象類型。例如:文本信息長度超過4000、二進制文件等。最大容量為4GB。
lob分類:clob:用於存儲大型文本數據。(例如:備注信息)
blob:用於存儲二進制數據。(例如:圖片文件)
bfile:作為獨立文件存在的二進制數據。
5、特殊數據:
null與空字元串:null與空字元串,都要用is null或is not null進行比較。
單引號:想將單引號做為字元中使用,請通過單引號進行轉義。
6、注意:oracle中,沒有布爾類型,可利用字元串或數值(1/0)表示
② oracle資料庫的物理存儲結構有那些,它們各自的作用
http://hi..com/blue_greed/blog/item/dcea21ca97bf7782c8176816.html
去這里看看~~
數據結構在計算機中的表示(映像)稱為數據的物理(存儲)結構。它包括數據元素的表示和關系的表示。
物理結構,即Oracle資料庫使用的操作系統文件結構。對於資料庫物理結構文件,不同的oracle版本,不同的操作系統平台上有不同的存儲目錄結構
資料庫的物理結構文件按其作用可以分為三類:
數據文件
日誌文件
控制文件
一、數據文件
數據文件用來存儲資料庫的數據,如表、索引等。讀取數據時,系統首先從資料庫文件中讀取數據,並存儲到SGA的數據緩沖區中。
二、重做日誌文件
重做日誌文件記錄對資料庫的所有修改信息。它是三類文件中最復雜的一類文件,也是保證資料庫安全與資料庫備份與恢復有直接關系的文件。
三、控制文件
控制文件是一個二進制文件,用來描述資料庫的物理結構,一個資料庫只需要一個控制文件,控制文件的內容包括:
資料庫名及資料庫唯一標識
數據文件和日誌文件標識
資料庫恢復所需的同步信息,即檢查點號
③ ORACLE 存二進制用什麼數據類型
可以用blob或bfile類型來存儲該類二進制數據。具體說明如下: ★ blob:用來存儲可變長度的二進制數據,blob數據在資料庫之間或在客戶機與伺服器進程之間傳遞,yVSkyV
④ 存放在oracle的二進制文件怎麼判斷文件類型
你所取得的是二進制的格式,是byte[]形式的,這樣你對照下表即可。
它們的格式是你判斷的依據:
1.JPEG
- 文件頭標識 (2 bytes): $ff, $d8 (SOI) (JPEG 文件標識)
- 文件結束標識 (2 bytes): $ff, $d9 (EOI)
2.TGA
- 未壓縮的前5位元組 00 00 02 00 00
- RLE壓縮的前5位元組 00 00 10 00 00
3.PNG
- 文件頭標識 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
4.GIF
- 文件頭標識 (6 bytes) 47 49 46 38 39(37) 61
G I F 8 9 (7) a
5.BMP
- 文件頭標識 (2 bytes) 42 4D
B M
6.PCX
- 文件頭標識 (1 bytes) 0A
7.TIFF
- 文件頭標識 (2 bytes) 4D 4D 或 49 49
8.ICO
- 文件頭標識 (8 bytes) 00 00 01 00 01 00 20 20
9.CUR
- 文件頭標識 (8 bytes) 00 00 02 00 01 00 20 20
10.IFF
- 文件頭標識 (4 bytes) 46 4F 52 4D
F O R M
11.ANI
- 文件頭標識 (4 bytes) 52 49 46 46
R I F F
⑤ oracle如何存儲byte類型數據
這個我其實也不大懂 不過以前在倉庫中存了這方面的一點小東東 希望對你游泳 嘿嘿 不知道是不是你想要的 先搞上來你看看吧
Oracle中的BLOB和CLOB
一、區別和定義
LONG: 可變長的字元串數據,最長2G,LONG具有VARCHAR2列的特性,可以存儲長文本一個表中最多一個LONG列
LONG RAW: 可變長二進制數據,最長2G
CLOB: 字元大對象Clob 用來存儲單位元組的字元數據
NCLOB: 用來存儲多位元組的字元數據
BLOB: 用於存儲二進制數據
BFILE: 存儲在文件中的二進制數據,這個文件中的數據只能被只讀訪。但該文件不包含在資料庫內。
bfile欄位實際的文件存儲在文件系統中,欄位中存儲的是文件定位指針.bfile對oracle來說是只讀的,也不參與事務性控制和數據恢復.
CLOB,NCLOB,BLOB都是內部的LOB(Large Object)類型,最長4G,沒有LONG只能有一列的限制
要保存圖片、文本文件、Word文件各自最好用哪種數據類型?
--BLOB最好,LONG RAW也不錯,但Long是oracle將要廢棄的類型,因此建議用BLOB。
二、操作
1、 get
CLOB
java 代碼
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
Reader inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是讀出並需要返回的數據,類型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
BLOB
java 代碼
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");
if (rs.next())
{
java.sql.Blob blob = rs.getBlob("BLOBATTR");
InputStream inStream = blob.getBinaryStream();
//data是讀出並需要返回的數據,類型是byte[]
data = new byte[input.available()];
inStream.read(data);
inStream.close();
}
inStream.close();
con.commit();
con.close();
2、 put
CLOB
java 代碼
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是傳入的字元串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
BLOB
java 代碼
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob對象後強制轉換為oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是傳入的byte數組,定義:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
=======================================================================
厚厚發表於 2006年06月27日
網路上很多關於JAVA對Oracle中BLOB、CLOB類型欄位的操作說明,有的不夠全面,有的不夠准確,甚至有的簡直就是胡說八道。最近的項目正巧用到了這方面的知識,在這里做個總結。
環境:
Database: Oracle 9i
App Server: BEA Weblogic 8.14
表結構:
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob)
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob)
JAVA可以通過JDBC,也可以通過JNDI訪問並操作資料庫,這兩種方式的具體操作存在著一些差異,由於通過App Server的資料庫連接池JNDI獲得的資料庫連接提供的java.sql.Blob和java.sql.Clob實現類與JDBC方式提供的不同,因此在入庫操作的時候需要分別對待;出庫操作沒有這種差異,因此不用單獨對待。
一、BLOB操作
1、入庫
(1)JDBC方式
//通過JDBC獲得資料庫連接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob對象後強制轉換為oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是傳入的byte數組,定義:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
(2)JNDI方式
//通過JNDI獲得資料庫連接
Context context = new InitialContext();
ds = (DataSource) context.lookup("ORA_JNDI");
Connection con = ds.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob對象後強制轉換為weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server對應的可能會不同)
weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是傳入的byte數組,定義:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
2、出庫
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");
if (rs.next())
{
java.sql.Blob blob = rs.getBlob("BLOBATTR");
InputStream inStream = blob.getBinaryStream();
//data是讀出並需要返回的數據,類型是byte[]
data = new byte[input.available()];
inStream.read(data);
inStream.close();
}
inStream.close();
con.commit();
con.close();
二、CLOB操作
1、入庫
(1)JDBC方式
//通過JDBC獲得資料庫連接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是傳入的字元串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
(2)JNDI方式
//通過JNDI獲得資料庫連接
Context context = new InitialContext();
ds = (DataSource) context.lookup("ORA_JNDI");
Connection con = ds.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server對應的可能會不同)
weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是傳入的字元串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
2、出庫
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
Reader inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是讀出並需要返回的數據,類型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
需要注意的地方:
1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob幾種類型的區別
2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob幾種類型的區別
⑥ 怎麼將oracle資料庫存的二進制轉換十進制
--十進制轉其他進制函數
create or replace function to_base( p_dec in number, p_base in number )
return varchar2
is
l_str varchar2(255) default NULL;
l_num number default p_dec;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) then
raise PROGRAM_ERROR;
end if;
loop
l_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str;
l_num := trunc( l_num/p_base );
exit when ( l_num = 0 );
end loop;
return l_str;
end to_base;
--其他進制轉十進制
create or replace function to_dec ( p_str in varchar2, p_from_base in number default 16 )
return number
is
l_num number default 0;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
for i in 1 .. length(p_str) loop
l_num := l_num * p_from_base + instr(l_hex,upper(substr(p_str,i,1)))-1;
end loop;
return l_num;
end to_dec;
⑦ oracle 數據類型
按類型分為:字元串類型、數字類型、日期類型、LOB類型、LONG RAW& RAW類型、ROWID & UROWID類型。
在講敘字元串類型前,先要講一下編碼。字元串類型的數據可依編碼方式分成資料庫字元集(CHAR/VARCHAR2/CLOB/LONG)和國際字元集(NCHAR/NVARCHAR2/NCLOB)兩種。資料庫中的字元串數據都通過字元集將字元轉換為數字後(二進制),才存儲到數據塊中。通過不同的編碼集轉換,即便是相同的字元,也可能會轉換成不同的二進制編碼。這也是產生亂碼的原因。資料庫的編碼格式一般是在創建資料庫時指定的。當然也可以修改資料庫的編碼。
一 字元串類型
1.1:CHAR類型 CHAR(size [BYTE | CHAR])
CHAR類型,定長字元串,會用空格填充來達到其最大長度。非NULL的CHAR(12)總是包含12位元組信息。CHAR欄位最多可以存儲2,000位元組的信息。如果創建表時,不指定CHAR長度,則默認為1。另外你可以指定它存儲位元組或字元,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般來說默認是存儲位元組
注意:資料庫的NLS_CHARACTERSET 為AL32UTF8,即一個漢字佔用三到四個位元組。如果NLS_CHARACTERSET為ZHS16GBK,則一個字元佔用兩個位元組。
1.2: NCHAR類型
這是一個包含UNICODE格式數據的定長字元串。NCHAR欄位最多可以存儲2,000位元組的信息。它的最大長度取決於國家字元集。
1.3 VARCHAR類型
不要使用VARCHAR數據類型。使用VARCHAR2數據類型。
1.4: VARCHAR2類型
變長字元串,與CHAR類型不同,它不會使用空格填充至最大長度。VARCHAR2最多可以存儲4,000位元組的信息。
1.5: NVARCHAR2類型
這是一個包含UNICODE格式數據的變長字元串。 NVARCHAR2最多可以存儲4,000位元組的信息。
二. 數字類型
2.1 NUMBER類型
NUMBER(P,S)是最常見的數字類型,可以存放數據范圍為10130~10126(不包含此值),需要1~22位元組(BYTE)不等的存儲空間。
P 是Precison的英文縮寫,即精度縮寫,表示有效數字的位數,最多不能超過38個有效數字
S是Scale的英文縮寫,可以使用的范圍為-84~127。Scale為正數時,表示從小數點到最低有效數字的位數,它為負數時,表示從最大有效數字到小數點的位數
下面是官方文檔的示例
Actual Data Specified As Stored As
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(3) 124
123.89 NUMBER(4,2) exceeds precision
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5).01234
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
2.2 INTEGER類型
INTEGER是NUMBER的子類型,它等同於NUMBER(38,0),用來存儲整數。若插入、更新的數值有小數,則會被四捨五入。
2.3 浮點數
Oracle 資料庫提供了專為浮點數的兩種數值數據類型:
BINARY_FLOAT
BINARY_FLOAT 是 32 位、 單精度浮點數字數據類型。可以支持至少6位精度,每個 BINARY_FLOAT 的值需要 5 個位元組,包括長度位元組。
BINARY_DOUBLE
BINARY_DOUBLE 是為 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 的值需要 9 個位元組,包括長度位元組。
在數字的列中,浮點數有小數精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮點數有二進制的精度。二進制浮點數支持的特殊值無窮大和 NaN (不是數字)。
2.5 FLOAT類型
FLOAT類型也是NUMBER的子類型。
Float(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從 1 到 126。若要從二進制轉換為十進制的精度,請將 n 乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193 乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
三. 日期類型
日期類型用於存儲日期數據,但是並不是使用一般的格式(2012-08-08)直接存儲到資料庫的。
3.1 DATE類型
DATE是最常用的數據類型,日期數據類型存儲日期和時間信息。雖然可以用字元或數字類型表示日期和時間信息,但是日期數據類型具有特殊關聯的屬性。為每個日期值,Oracle 存儲以下信息: 世紀、 年、 月、 日期、 小時、 分鍾和秒。一般佔用7個位元組的存儲空間。
3.2 TIMESTAMP類型
這是一個7位元組或12位元組的定寬日期/時間數據類型。它與DATE數據類型不同,因為TIMESTAMP可以包含小數秒,帶小數秒的TIMESTAMP在小數點右邊最多可以保留9位
3.3 TIMESTAMP WITH TIME ZONE類型
這是TIMESTAMP類型的變種,它包含了時區偏移量的值
3.4 TIMESTAMP WITH LOCAL TIME ZONE類型
3.5 INTERVAL YEAR TO MOTH
3.6 INTERVAL DAY TO SECOND
四. LOB類型
內置的LOB數據類型包括BLOB、CLOB、NCLOB、BFILE(外部存儲)的大型化和非結構化數據,如文本、圖像、視屏、空間數據存儲。BLOB、CLOB、NCLOB類型
4.1 CLOB 數據類型
它存儲單位元組和多位元組字元數據。支持固定寬度和可變寬度的字元集。CLOB對象可以存儲最多 (4 gigabytes-1) * (database block size) 大小的字元
4.2 NCLOB 數據類型
它存儲UNICODE類型的數據,支持固定寬度和可變寬度的字元集,NCLOB對象可以存儲最多(4 gigabytes-1) * (database block size)大小的文本數據。
4.3 BLOB 數據類型
它存儲非結構化的二進制數據大對象,它可以被認為是沒有字元集語義的比特流,一般是圖像、聲音、視頻等文件。BLOB對象最多存儲(4 gigabytes-1) * (database block size)的二進制數據。
4.4 BFILE 數據類型
二進制文件,存儲在資料庫外的系統文件,只讀的,資料庫會將該文件當二進制文件處理
五. RAW & LONG RAW類型
5.1 LONG類型
它存儲變長字元串,最多達2G的字元數據(2GB是指2千兆位元組, 而不是2千兆字元),與VARCHAR2 或CHAR 類型一樣,存儲在LONG 類型中的文本要進行字元集轉換。ORACLE建議開發中使用CLOB替代LONG類型。支持LONG 列只是為了保證向後兼容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制如下:
1.一個表中只有一列可以為LONG型。(Why?有些不明白)
2.LONG列不能定義為主鍵或唯一約束,
3.不能建立索引
4.LONG數據不能指定正則表達式。
5.函數或存儲過程不能接受LONG數據類型的參數。
6.LONG列不能出現在WHERE子句或完整性約束(除了可能會出現NULL和NOT NULL約束)
5.2 LONG RAW 類型,能存儲2GB 的原始二進制數據(不用進行字元集轉換的數據)
5.3 RAW類型
用於存儲二進制或字元類型數據,變長二進制數據類型,這說明採用這種數據類型存儲的數據不會發生字元集轉換。這種類型最多可以存儲2,000位元組的信息
六. ROWID & UROWID類型
在資料庫中的每一行都有一個地址。然而,一些錶行的地址不是物理或永久的,或者不是ORACLE資料庫生成的。
例如,索引組織錶行地址存儲在索引的葉子,可以移動。
例如,外部表的ROWID(如通過網關訪問DB2表)不是標準的ORACLE的rowid。
ORACLE使用通用的ROWID(UROWIDs)的存儲地址的索引組織表和外表。索引組織表有邏輯urowids的,和國外表的外urowids。UROWID這兩種類型的存儲在ROWID偽(堆組織的表的物理行id)。
創建基於邏輯的rowid在表中的主鍵。邏輯的rowid不會改變,只要主鍵不改變。索引組織表的ROWID偽UROWID數據類型。你可以訪問這個偽列,你會堆組織表的ROWID偽(即使用一個SELECT …ROWID語句)。如果你想存儲的rowid索引組織表,那麼你就可以定義一列的表型UROWID到列檢索值的ROWID偽。
⑧ 如何利用C #往Oracle 中以二進制存取圖片。
資料庫側欄位設為blob格式
c#測與存儲一般欄位方法相同,只是要先將圖片轉成二進制數組 byte[]格式進行存儲即可
⑨ 如何將二進制文件存入Oracle資料庫中
先把文件讀取到內存,再以二進制格式保持到資料庫中的大欄位中(clob或clob)。
寫大對象。
Java code
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
OutputStream os = null;
FileInputStream fis = null;
int bs = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB","bigfou","---");
conn.setAutoCommit(false);
stat = conn.createStatement();
stat.executeUpdate("insert into t_video(id,video) values(1,empty_blob())");
rs = stat.executeQuery("select video from t_video where id = 1");
rs.next();
oracle.sql.BLOB blo = (oracle.sql.BLOB)rs.getBlob(1);
os = blo.getBinaryOutputStream();
bs = blo.getBufferSize();
fis = new FileInputStream("D:\\Temp\\MPlayer-CVS-20040808-K&K\\mplayer.exe");
byte[] buf = new byte[bs];
int length = 0;
while(true)
{
length = fis.read(buf);
if(length == -1) break;
os.write(buf,0,length);
}
os.close();
os = null;
fis.close();
fis = null;
conn.commit();
conn.setAutoCommit(true);
conn.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
讀大對象
Java code
InputStream is = null;
FileOutputStream fos = null;
byte[] buf = null;
int bs = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB","bigfou","-");
conn.setAutoCommit(false);
stat = conn.createStatement();
rs = stat.executeQuery("select video from t_video where id = 1");
rs.next();
oracle.sql.BLOB blo = (oracle.sql.BLOB)rs.getBlob(1);
bs = blo.getBufferSize();
buf = new byte[bs];
int length = 0;
is = blo.getBinaryStream();
fos = new FileOutputStream("d:\\test.exe");
while(true) {
length = is.read(buf);
if(length == -1) break;
fos.write(buf,0,length);
}
fos.close();
fos = null;
is.close();
is = null;
conn.commit();
conn.setAutoCommit(true);
conn.close();
...