Oracle blob转long raw测试
oracle--导出、导入blob类型的字段
oracle--导出、导⼊blob类型的字段以下操作记录了blob字段的导出、导⼊⽅法流程。
⽅法原理:利⽤UTL_FILE将blob字段的内容以⼆进制的形式导出到txt⽂档,然后⽤dbms_blob将⽂档内容导⼊到指定的数据库表中。
1、创建⼀个⽂本⽂档来保存blob数据。
这⾥在E盘home/dhl下创建⼀个名为text.txt的⽂件。
2、创建oracle临时⽬录1create or replace directory UTL_FILE_DIR as'E:/home/dhl/';2GRANT read ,write ON DIRECTORY UTL_FILE_DIR TO PUBLIC;注意: ⽬录下⾯要有text.txt的⽂件3、导出blob数据这⾥以SVS.SVS_ACCADM_SEALINFO表这张数据表为例⼦,其中的SEAL就是BLOB类型的字段1DECLARE2 file_handle UTL_FILE.FILE_TYPE;3 b_lob BLOB;4BEGIN5select SEAL into b_lob from SVS.SVS_ACCADM_SEALINFO where ID='100007922';67 file_handle := utl_file.fopen('UTL_FILE_DIR', 'test.txt', 'WB');8 utl_file.put_raw(file_handle , b_lob, true);9 UTL_FILE.FCLOSE(file_handle);10END;执⾏完后,会把这条数据的BLOB类型的数据以⼆进制的形式写⼊到了text.txt的⽂件中。
4、将⽂档内容导⼊到指定的数据库表中1DECLARE2 b_file bfile;3 b_lob BLOB;4BEGIN5--return a into b_lob将该列与⼀个blog类型的变量绑定在⼀起,以后只要为b_lob赋值,即等于将该值插⼊了表中6INSERT7INTO SVS.SVS_ACCADM_SEALINFO8 (9 ID,10 SEAL,11 SMALL_CODE,12 SEAL_TYPE,13 START_DATE,14 END_DATE,15 NO_USE_DATE,16 MEMO,17 SEAL_POSITION,18 ACC_NO,19 SEAL_CARD_ID,20 SEAL_CARD_NO,21 DOC_OBJECT_ID,22 CRUD_FLAG23 )24VALUES25 (26'100007922',27 EMPTY_BLOB(),28NULL,29'P',30'2019-11-26',31NULL,32NULL,33NULL,34NULL,35'2019112601',36'1199129990231314433',37'100003981',38'e19b7edfcdee436598367485605921cc57226621258',39'4'40 )41RETURN SEAL42INTO b_lob;43--将⽂件转换为bfile44 b_file := bfilename('UTL_FILE_DIR', 'test.txt');45 dbms_lob.open(b_file, dbms_lob.file_readonly);46-- 将b_file中的内容转换到b_lob47 dbms_lob.loadfromfile(b_lob,b_file,dbms_lob.getlength(b_file));48 dbms_lob.close(b_file);49COMMIT;50END;。
ORACLE常用数据库类型(转)
ORACLE常⽤数据库类型(转)oracle常⽤数据类型1、Char定长格式字符串,在数据库中存储时不⾜位数填补空格,它的声明⽅式如下CHAR(L),L为字符串长度,缺省为1,作为变量最⼤32767个字符,作为数据存储在ORACLE8中最⼤为2000。
不建议使⽤,会带来不必要的⿇烦a、字符串⽐较的时候,如果不注意(char不⾜位补空格)会带来错误b、字符串⽐较的时候,如果⽤trim函数,这样该字段上的索引就失效(有时候会带来严重性能问题)c、浪费存储空间(⽆法精准计算未来存储⼤⼩,只能留有⾜够的空间;字符串的长度就是其所占⽤空间的⼤⼩)2、Varchar2/varchar⽬前VARCHAR是VARCHAR2的同义词。
⼯业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。
Oracle⾃⼰开发了⼀个数据类型VARCHAR2,这个类型不是⼀个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。
如果你想有向后兼容的能⼒,Oracle建议使⽤VARCHAR2⽽不是VARCHAR。
不定长格式字符串,它的声明⽅式如下VARCHAR2(L),L为字符串长度,没有缺省值,作为变量最⼤32767个字节,作为数据存储在ORACLE8中最⼤为4000。
在多字节语⾔环境中,实际存储的字符个数可能⼩于L值,例如:当语⾔环境为中⽂(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)时,⼀个VARCHAR2(200)的数据列可以保存200个英⽂字符或者100个汉字字符;对于4000字节以内的字符串,建议都⽤该类型a。
VARCHAR2⽐CHAR节省空间,在效率上⽐CHAR会稍微差⼀些,即要想获得效率,就必须牺牲⼀定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
b。
VARCHAR2虽然⽐CHAR节省空间,但是如果⼀个VARCHAR2列经常被修改,⽽且每次被修改的数据的长度不同,这会引起‘⾏迁移’(Row Migration)现象,⽽这造成多余的I/O,是数据库设计和调整中要尽⼒避免的,在这种情况下⽤CHAR代替VARCHAR2会更好⼀些。
(转)Oracle中LONGRAWBLOBCLOB类型介绍
(转)Oracle中LONGRAWBLOBCLOB类型介绍RAW:未加⼯类型,可存储⼆进制数据或字节符LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长⽂本⼀个表中最多⼀个LONG列【不建议使⽤】LONG RAW: 可变长⼆进制数据,最长2G 【不建议使⽤】CLOB: 字符⼤对象Clob ⽤来存储单字节的字符数据;⼤型⽂本,例如XML数据。
NCLOB: ⽤来存储多字节的字符数据BLOB: ⽤于存储⼆进制⼤对象数据;例如数码照⽚;BFILE: 存储在⽂件中的⼆进制数据,这个⽂件中的数据只能被只读访。
但该⽂件不包含在数据库内。
bfile字段实际的⽂件存储在⽂件系统中,字段中存储的是⽂件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复.CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有LONG只能有⼀列的限制注意: LONG 和 LONG RAW在Oracle新版已不推荐使⽤(使⽤BLOB替代),只是为了向后兼容⽽保留着。
本⽂着重介绍:RAW/CLOB/BLOB1、RAW类型1.1 介绍You use the RAW datatype to store binary data or byte strings. For example, a RAWvariable might store a sequence of graphics characters or a digitized picture. Raw datais like VARCHAR2 data, except that PL/SQL does not interpret raw data. Likewise,Oracle Net does no character set conversions when you transmit raw data from onesystem to another.The RAW datatype takes a required parameter that lets you specify a maximum size upto 32767 bytes. The syntax follows:RAW(maximum_size)You cannot use a symbolic constant or variable to specify the maximum size; you mustuse an integer literal in the range 1 .. 32767.You cannot insert RAW values longer than 2000 bytes into a RAW column. You can insertany RAW value into a LONG RAW database column because the maximum width of aLONG RAW column is 2147483648 bytes or two gigabytes. However, you cannot retrievea value longer than 32767 bytes from a LONG RAW column into a RAW variable. Notethat the LONG RAW datatype is supported only for backward compatibility; see “LONGand LONG RAW Datatypes” on page 3-5 for more information.RAW英语的意思为:⽣的;未加⼯的;你可以使⽤RAW类型存储⼆进制数据或字节符。
Oracle数据类型
oracle数据类型以下的大多数类型的描述都经本人验证,但不免有错误,请不吝赐教(oracle: 10.2.0.3.0 ,plsql: 7.1.5.1398 )注:以下两个函数有助于理解数据类型length() 当前列存储值的字符长度;vsize() 当前列存储值所占用字节数。
1.CHAR固定长度字符域, 最大长度可达2000 个字符或者字节。
默认指定为以字符形式进行存储,并且当位数不够时oracle 在其右边添加空格来补满。
例如:2.VARCHAR2可变长度字符域,最大长度可达4000 个字符。
例如:CREATE TABLE test(name varchar2(20))2.1.CHAR和VARCHAR2区别1.CHAR 的长度是固定的,而VARCHAR2 的长度是可以变化的,比如,存储字符串,对于CHAR (20),表示你存储的字符将占20 个字节(包括17 个空字符),而同样的VARCHAR2 (20)则只占用3 个字节的长度,20 只是最大值,当你存储的字符小于20 时,按实际长度存储。
2 .CHAR 的效率比VARCHAR2 的效率稍高。
3.目前VARCHAR 是VARCHAR2 的同义词。
工业标准的VARCHAR 类型可以存储空字符串,但是Oracle 不这样做,尽管它保留以后这样做的权利。
Oracle 自己开辟了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar 列可以存储空字符串的特性改为存储NULL 值。
假如你想有向后兼容的能力,Oracle 建议使用VARCHAR2 而不是VARCHAR。
何时该用CHAR,何时该用varchar2?CHAR 与VARCHAR2 是一对矛盾的统一体,两者是互补的关系. VARCHAR2 比CHAR 节省空间,在效率上比CHAR 会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’ 。
oracle 二进制写法
在Oracle数据库中,可以使用二进制数据类型来存储二进制数据。
以下是Oracle中二进制数据的几种常见表示方法:1. RAW数据类型: `RAW` 是一种二进制数据类型,用于存储任意长度的二进制数据。
创建表时,可以这样定义一个`RAW` 列:sql`CREATE TABLE binary_data_table (id NUMBER,binary_data RAW(2000));`2. 使用HEX函数:可以使用`TO_RAW` 函数将十六进制字符串转换为`RAW` 数据类型。
例如:sql`SELECT TO_RAW('4D5A', 'HEX') FROM dual;`3. 使用RAWTOHEX函数和RAW:可以使用`RAWTOHEX` 函数将`RAW` 数据转换为十六进制字符串。
例如:sql`SELECT RAWTOHEX(TO_RAW('Hello World')) FROM dual;`4. BLOB数据类型:`BLOB` 是用于存储大型二进制对象的数据类型。
与`RAW` 类似,但可以存储更大的数据。
5. 使用PL/SQL处理二进制数据:Oracle提供了很多用于处理二进制数据的PL/SQL函数,例如`UTL_I18N.STRING_TO_RAW` 和`UTL_I18N.RAW_TO_CHAR`。
6. 在INSERT语句中直接插入二进制数据:可以直接在INSERT语句中插入二进制数据。
例如:sql`INSERT INTO binary_data_table (id, binary_data) VALUES (1, UTL_I18N.STRING_TO_RAW('Hello World', 'AL32UTF8'));`7. 使用DBMS_LOB包:对于BLOB和CLOB数据类型,可以使用DBMS_LOB包中的函数来处理二进制数据。
使用java读取oracleblob字段实现上传下载
使用JAVA读取ORACLE BLOB字段实现上传下载大对象类型BLOB全称为Binary Large Objects,即二进制大对象。
可以把BLOB区别为三种形式:声像数据、二进制数据和大文本数据。
因此,最常见的应用就是存储图形、声音等对象,此外大二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储。
我们在经常使用的编程环境中并不能直接支持BLOB字段,因此需要调用相应的函数完成BLOB的使用。
二实际Struts项目的处理流程1 插入BLOB字段的流程表示层:上传使用struts的<html:file property="drawingFile"/>标签,提交给指定处理的Action,在ActionForm中使用struts自带的FormFile来保存文件。
核心代码:<html:form action="/DrawingInputMultiAction" enctype="multipart/form-data"><html:file property="drawingFile"/>....省略</html:form>控制层:在Action中将传入的ActionForm中的文件字段赋给VO值对象,并调用业务代理类的上传方法。
核心代码:.省略其他set方法.省略}Facade门面:通过业务代理类调用DAO中的上传方法,对客户端完全透明。
public int insertDrawing(DrawingVO drawingVO) throws ComtopModuleException {try {DrawingDAO drawingDAO = new DrawingDAO();return (drawingVO);} catch(DrawingException ex) {throw new ComtopModuleException("", ex);}}持久层:DAO中实现和ORACLE数据库的底层交涉,完成真正的文件上传。
ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)
ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)这里我用的是ORACLE9I, 建立了表C_EMP1_T,结构如下:create table C_EMP1_T(EMP_ID NUMBER(20) not null, //用户IDEMP_NO VARCHAR2(20), //用户编号EMP_DESC LONG, //用户简历USED_DATE DATE, //注册日期EMP_IC_MAC RAW(50), //用户IC卡的MAC号EMP_ADMIN_FLAG CHAR(1), //管理员标志EMP_PICTURE BLOB //用户图像)其中INSERT/UPDATE/SELECT的代码分别如下(DELETE比较简单就省略了,其中SELECT和UPDATE的条件都是记录的rowid):首先BLOB字段是存图片的,所以有一个过程是把图片传到服务器上:先在aspx上加:<form id="Form1" enctype="multipart/form-data" method="post"runat="server"><input id="IoFile" runat="server" type="file"><FONT face="宋体">下一步→</FONT><asp:Button id="btunload" runat="server" Text="上传"></asp:Button> </form>和代码:private void btunload_Click(object sender, System.EventArgs e){btunload.Enabled = false;//获得文件名称string tempfilename = IoFile.PostedFile.FileName;//注: loFile.PostedFile.FileName 返回的是通过文件对话框选择的文件名,这之中包含了文件的目录信息tempfilename = Path.GetFileName ( tempfilename);if (tempfilename.Substring(tempfilename.Length-4,4) == ".bmp") {//去掉目录信息,返回文件名称//判断上传目录是否存在,不存在就建立string tempDirectory = "D:/WWWROOT/MYWEB/dbtest/Image/";if ( ! Directory.Exists ( tempDirectory ) )Directory.CreateDirectory ( tempDirectory ) ;//上传文件到服务器string tempPath = tempDirectory+tempfilename;//得到上传目录及文件名称IoFile.PostedFile.SaveAs ( tempPath );Label1.Text = "<img src='image/"+tempfilename+"'>";Session["filename"] = tempfilename;}else{Label1.Text = "错误的文件类型";}btunload.Enabled = true;/*' 获得并显示上传文件的属性FileName.Text = lstrFileName' 获得文件名称FileType.Text = loFile.PostedFile.ContentType' 获得文件类型FileLength.Text = cStr ( loFile.PostedFile.ContentLength )' 获得文件长度FileUploadForm.visible = falseAnswerMsg.visible = true' 显示上传文件属性End sub */}INSERT:private void BtInsert_Click(object sender, System.EventArgs e){OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();//OracleCommand Ocom = new OracleCommand("insert into c_emp 1_t (EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLA G,EMP_PICTURE)values(:emp_id,:emp_no,:emp_desc,:emp_date,:emp_ic_m ac,:flag,:picture)",Ocon);OracleCommand Ocom = new OracleCommand("insert into c_emp1 _t (EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLA G)values(:emp_id,:emp_no,:emp_desc,:emp_date,:emp_ic_mac,:flag)",Oco n);Ocom.Parameters.Add(new OracleParameter("emp_id",OracleType. Number));Ocom.Parameters.Add(new OracleParameter("emp_no",OracleType. VarChar));Ocom.Parameters.Add(new OracleParameter("emp_desc",OracleTyp e.LongVarChar));Ocom.Parameters.Add(new OracleParameter("emp_date",OracleTyp e.DateTime));Ocom.Parameters.Add(new OracleParameter("flag",OracleType.Cha r));Ocom.Parameters.Add(new OracleParameter("emp_ic_mac",OracleT ype.Raw));//Ocom.Parameters.Add(new OracleParameter("picture",OracleType. Blob));Ocom.Parameters["emp_id"].Value = Convert.ToDecimal(tbempid.T ext);Ocom.Parameters["emp_no"].Value = tbempno.Text;Ocom.Parameters["emp_desc"].Value = tbempdesc.Text;string empdate = tbempdate.Text;// yyyymmddOcom.Parameters["emp_date"].Value = new DateTime(Convert.T oInt32(empdate.Substring(0,4)),Convert.ToInt32(empdate.Substring(4,2)),C onvert.ToInt32(empdate.Substring(6,2)) );if (rb1.Checked)Ocom.Parameters["flag"].Value = '1';if (rb2.Checked)Ocom.Parameters["flag"].Value = '2';if (rb3.Checked)Ocom.Parameters["flag"].Value = '3';Ocom.Parameters["emp_ic_mac"].Value = setraw(tbicmac.Text);Ocom.ExecuteNonQuery();/*由与有字段long和blob一起,所以不能在一个insert语句中进行插入,单独insert是成功的OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("insert into c_emp1 _t (EMP_ID,EMP_PICTURE)values(:emp_id,:picture)",Ocon);Ocom.Parameters.Add(new OracleParameter("emp_id",OracleType. Number));Ocom.Parameters.Add(new OracleParameter("picture",OracleType.B lob));Ocom.Parameters["emp_id"].Value = Convert.ToDecimal(tbempid.T ext);FileStream reader = new FileStream("D:/WWWROOT/MYWEB/dbtes t/Image/002.bmp",FileMode.Open);//在iis中不用用“\”目录结构应该是“/”byte[] tempimage = new byte[reader.Length];reader.Read(tempimage,0,tempimage.Length);//OracleLob tempLob=OracleLob.Null;//tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);//tempLob.Write(tempimage,0,tempimage.Length);//tempLob.EndBatch();reader.Close();Ocom.Parameters["picture"].Size = tempimage.Length;//tempimage.CopyTo(Ocom.Parameters["picture"].Value,0);Ocom.Parameters["picture"].Value = tempimage;Ocom.ExecuteNonQuery();*/string myfilename = Convert.ToString(Session["filename"]);if (myfilename != ""){Ocom.Parameters.Clear();mandText = "update c_emp1_t SET EMP_PICTURE = : PICTURE WHERE EMP_ID= :EMP_ID ";Ocom.Parameters.Add(new OracleParameter("EMP_ID",OracleTy pe.Number));Ocom.Parameters.Add(new OracleParameter("PICTURE",OracleT ype.Blob));Ocom.Parameters["EMP_ID"].Value = Convert.ToDecimal(tbempi d.Text);FileStream reader = new FileStream("D:/WWWROOT/MYWEB/db test/Image/"+myfilename,FileMode.Open);//在iis中不用用“\”目录结构应该是“/”byte[] tempimage = new byte[reader.Length];reader.Read(tempimage,0,tempimage.Length);reader.Close();Ocom.Parameters["PICTURE"].Size = tempimage.Length;Ocom.Parameters["PICTURE"].Value = tempimage;Ocom.ExecuteNonQuery();Session["filename"] = "";}Ocon.Close();}UPDATE:private void btUpdate_Click(object sender, System.EventArgs e){OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("UPDATE c_emp1_ t SET EMP_ID= :emp_id,EMP_NO= :emp_no,EMP_DESC= :emp_desc,USED_ DATE= :emp_date,EMP_IC_MAC= :emp_ic_mac,EMP_ADMIN_FLAG= :flag W HERE ROWID = :MYROWID",Ocon);Ocom.Parameters.Add(new OracleParameter("MYROWID",OracleTyp e.RowId));Ocom.Parameters.Add(new OracleParameter("emp_id",OracleType. Number));Ocom.Parameters.Add(new OracleParameter("emp_no",OracleType. VarChar));Ocom.Parameters.Add(new OracleParameter("emp_desc",OracleTyp e.LongVarChar));Ocom.Parameters.Add(new OracleParameter("emp_date",OracleTyp e.DateTime));Ocom.Parameters.Add(new OracleParameter("flag",OracleType.Cha r));Ocom.Parameters.Add(new OracleParameter("emp_ic_mac",OracleT ype.Raw));Ocom.Parameters["MYROWID"].Value = TBROWID.Text;Ocom.Parameters["emp_id"].Value = Convert.ToDecimal(tbempid.T ext);Ocom.Parameters["emp_no"].Value = tbempno.Text;Ocom.Parameters["emp_desc"].Value = tbempdesc.Text;string empdate = tbempdate.Text;// yyyymmddOcom.Parameters["emp_date"].Value = new DateTime(Convert.T oInt32(empdate.Substring(0,4)),Convert.ToInt32(empdate.Substring(4,2)),C onvert.ToInt32(empdate.Substring(6,2)) );if (rb1.Checked)Ocom.Parameters["flag"].Value = '1';if (rb2.Checked)Ocom.Parameters["flag"].Value = '2';if (rb3.Checked)Ocom.Parameters["flag"].Value = '3';Ocom.Parameters["emp_ic_mac"].Value = setraw(tbicmac.Text);Ocom.ExecuteNonQuery();string myfilename = Convert.ToString(Session["filename"]);if (myfilename != ""){Ocom.Parameters.Clear();mandText = "update c_emp1_t SET EMP_PICTURE = : PICTURE WHERE EMP_ID= :EMP_ID ";Ocom.Parameters.Add(new OracleParameter("EMP_ID",OracleTy pe.Number));Ocom.Parameters.Add(new OracleParameter("PICTURE",OracleT ype.Blob));Ocom.Parameters["EMP_ID"].Value = Convert.ToDecimal(tbempi d.Text);FileStream reader = new FileStream("D:/WWWROOT/MYWEB/db test/Image/"+myfilename,FileMode.Open);//在iis中不用用“\”目录结构应该是“/”byte[] tempimage = new byte[reader.Length];reader.Read(tempimage,0,tempimage.Length);reader.Close();Ocom.Parameters["PICTURE"].Size = tempimage.Length;Ocom.Parameters["PICTURE"].Value = tempimage;Ocom.ExecuteNonQuery();Session["filename"] = "";}Ocon.Close();}SELECT(由于图片是直接向客户端输出,所以需要另一个页面来输入图片):private void btselect_Click(object sender, System.EventArgs e){if (TBROWID.Text.Length < 18){TBROWID.Text = "请输入正确的ROWID";return;}OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("select EMP_ID,EMP _NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLAG,EMP_PICTUR E from c_emp1_t where rowid = :emprowid",Ocon);Ocom.Parameters.Add(new OracleParameter("emprowid",OracleTyp e.RowId));Ocom.Parameters["emprowid"].Value = TBROWID.Text;OracleDataReader reader = Ocom.ExecuteReader();while (reader.Read()){if (!(reader.IsDBNull(0)))tbempid.Text = Convert.ToString( reader.GetDecimal(0));if (!(reader.IsDBNull(1)))tbempno.Text = reader.GetString(1);if (!(reader.IsDBNull(2)))tbempdesc.Text = reader.GetString(2);if (!(reader.IsDBNull(3))){DateTime DT = reader.GetDateTime(3);tbempdate.Text = DT.ToString("yyyyMMdd");}if (!(reader.IsDBNull(4))){byte[] temp = new byte[4000];reader.GetBytes(4,0,temp,0,4000);tbicmac.Text = getraw(temp);}elsetbicmac.Text = "";if (!(reader.IsDBNull(5))){/*char tempflag = reader.GetChar(5); //不支持此方法switch (tempflag){case '1':rb1.Checked = true;break;case '2':rb2.Checked = true;break;default :rb3.Checked = true;break;}*/char tempflag = Convert.ToChar(reader.GetValue(5));switch (tempflag){case '1':rb1.Checked = true;break;case '2':rb2.Checked = true;break;default :rb3.Checked = true;break;}}if (!(reader.IsDBNull(6))){Label1.Text = "<img src='webform3.aspx?ROWID="+TBROWI D.Text+"'>";}}reader.Close();Ocon.Close();}webform3.aspx的程序:private void Page_Load(object sender, System.EventArgs e){OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("select EMP_PICTUR E from c_emp1_t where rowid = :emprowid",Ocon);Ocom.Parameters.Add(new OracleParameter("emprowid",OracleTyp e.RowId));Ocom.Parameters["emprowid"].Value = Request.Params["ROWID"];OracleDataReader reader = Ocom.ExecuteReader();while (reader.Read()){if (!(reader.IsDBNull(0))){OracleLob tempBlob = reader.GetOracleLob(0);byte[] tempbuffer = new byte[tempBlob.Length];//tempBlob.BeginBatch(OracleLobOpenMode.ReadWrite);会有错误ORA-22292: 无法在没有事务处理的情况下以读写模式打开 LOBtempBlob.BeginBatch();tempBlob.Read(tempbuffer,0,tempbuffer.Length);tempBlob.EndBatch();//下面是把具体的文件保存出来BinaryWriter writer = new BinaryWriter(new FileStream("D:/ WWWROOT/MYWEB/dbtest/Image/temp.bmp",FileMode.Create));for(int i=0;i<tempbuffer.Length;i++){writer.Write(tempbuffer[i]);}writer.Close();//下面是直接把图片用流向客户端输出Response.BinaryWrite(tempbuffer);}}reader.Close();Ocon.Close();}这些代码在2000下测试通过的,初次写代码有些凌乱,请大家多多提意见。
oracle byte[]类型sql写法
oracle byte[]类型sql写法在Oracle数据库中,处理二进制数据(如byte[]类型)通常使用BLOB(Binary Large Object)数据类型。
以下是如何在SQL查询中使用BLOB数据类型的示例:1、创建包含BLOB字段的表:sqlCREATE TABLE blob_example (id NUMBER PRIMARY KEY,data BLOB);2、插入BLOB数据:你可以使用INSERT INTO语句插入BLOB数据。
为了演示,我们将使用Oracle的UTL_I18N.STRING_TO_RAW函数将字符串转换为RAW类型,然后再将其转换为BLOB。
sqlINSERT INTO blob_example (id, data)VALUES (1, UTL_I18N.STRING_TO_RAW('Hello', 'AL32UTF8'));3、查询BLOB数据:要查询BLOB数据,你可以使用标准的SELECT语句。
但要注意,直接在SQL查询中查看BLOB数据可能不直观。
通常,你会将BLOB数据检索到应用程序中,并在那里进行处理或显示。
sqlSELECT id, DBMS_LOB.GETLENGTH(data) AS blob_length, DBMS_LOB.SUBSTR(data, 10, 1) AS first_bytesFROM blob_example;4、更新BLOB数据:你可以使用UPDATE语句更新BLOB数据。
sqlUPDATE blob_exampleSET data = UTL_I18N.STRING_TO_RAW('World', 'AL32UTF8')WHERE id = 1;5、删除BLOB数据:如果你需要删除包含BLOB数据的行,可以使用DELETE语句。
sqlDELETE FROM blob_example WHERE id = 1;请注意,处理BLOB数据时,通常不建议在SQL查询中直接检查或操作其内容,因为这可能会影响性能。
Oracle 数据库中long,lob类型的区别及转换
Oracle 数据库中long,lob类型的区别及转换¾字符类:LONG:可变长的字符串数据,最长2G,LONG具有V ARCHAR2列的特性,可以存储长文本,一个表中最多一个LONG列¾二进制类:LONG RAW:可变长二进制数据,最长2G¾大对象类:CLOB:用来存储单字节的字符数据NCLOB:用来存储多字节的字符数据BLOB:用于存储二进制数据BFILE:存储在文件中的二进制数据,这个文件中的数据只能被只读访。
但该文件不包含在数据库内。
CLOB,NCLOB,BLOB都是内部的LOB类型,最长4G,没有LONG只能有一列的限制,对于保存图片、文本文件、Word文件,用BLOB最好,LONG RAW也不错,但Long是oracle将要废弃的类型,因此建议用LOB。
对于包含long数据类型的表t1,不能用“create table t2 as select * from t1;”的方式予以复制,会报“非法使用long类型”的错误:SQL>create table t1(myid number, mylong long);SQL(c3prd)>create table t2 as select * from t1;create table t2 as select * from t1*ERROR at line 1:ORA-00997: illegal use of LONG datatype解决的方法有:1)将long类型先转换成clob类型,再用上述方法复制SQL(c3prd)>create table t2 as select myid,to_lob(mylong) mylob from t1;Table created.SQL(c3prd)>desc t2Name Null? Type----------------------------------------------------- -------- ------------------------------------MYID NUMBERMYLOB CLOBSQL(c3prd)>create table t3 as select * from t2;Table created.SQL(c3prd)>desc t3Name Null? Type----------------------------------------------------- -------- ------------------------------------MYID NUMBERMYLOB CLOB2)用PL/SQL的方法declaretest_type long;beginselect mylong into test_type from t1;insert into t2(mylong) values(test_type);commit;end;/3)用sqlplus的copy命令SQL(c3prd)>create table t4(myid number, mylong long);Table created.SQL(c3prd)>insert into t4 select * from t1;insert into t4 select * from t1*ERROR at line 1:ORA-00997: illegal use of LONG datatypeSQL(c3prd)>copy from scott/tiger@c3prd insert t4(myid,mylong) using select * from t1;Array fetch/bind size is 15. (arraysize is 15)Will commit when done. (copycommit is 0)Maximum long size is 10000. (long is 10000)0 rows selected from atcdba@c3prd.0 rows inserted into T4.0 rows committed into T4 at DEFAULT HOST connection.。
oracle大字段的使用(转)
oracle⼤字段的使⽤(转)数据库⼤字段(Clob, Blob)不适合存储超过1MB的数据通常数据库都提供Clob,Blob,Text,Long等⼤字段类型来存放超过4K的数据,然⽽这绝不意味着应该使⽤⼤字段来保存超过1MB以上的数据⽂件。
之所以有⼤字段,往往是因为varchar类型有⼀定的长度限制,例如4K。
超过此长度的⽂本和⼆进制数据必须使⽤⼤字段保存。
不过通常情况下,⼤字段不意味着保存很⼤的⽂件,通常只是⼏⼗到⼏百KB的数据,例如很长的⽂章,图标,⼩图⽚等等。
超过1MB以上的数据保存在数据库有诸多的性能问题:速度慢Web Server可以直接读取硬盘⽂件,然后返回⽂件给客户端,或者应⽤服务器读硬盘⽂件返回客户端,其效率要远远超过应⽤服务器访问数据库读取数据返回客户端。
操作不⽅便必须把数据库打开⼀个流,构造⼀个Buffer,然后再输出⼀个ServletOutputStream。
占⽤数据库连接,加重数据库访问负载不说,如果⽤户突然中断下载,还需要处理数据库关闭动作,容易造成性能问题。
如果把整个数据读⼊内存再输出,则内存占⽤⾮常客观。
如果是硬盘⽂件,只要返回⼀个URL就可以了。
即使你不希望⽤户直接访问到⽂件,你也可以构造⼀个IOStream来输出⽂件,既不会占⽤数据库资源,传输速度也快。
性能有问题特别的情况是,如果并发很多⽤户来下载⼤⽂件的时候,应⽤服务器要占⽤⾮常多的内存来缓存⽂件内容,假设并发10个⽤户,下载10MB 的⽂件,JVM的峰值就⾄少需要100MB内存来⽀撑,很容易造成JVM崩溃。
Oracle其实还有⼀种File的Blob类型,虽然也是Blob,但是实际上File是保存在硬盘上的,这种⽅式的你可以试试看,只不过我觉得这种⽅式还不如直接操作⽂件⽅便,既然原理是⼀样的。
另外补充⼀点,常规的数据库备份都是⽆法备份Blob数据的,所以如果你把⽂件都保存到Blob⾥⾯去的话,数据库的备份是⼀个很头疼的⼤问题,你必须单独写程序把blob数据读出来,再写到硬盘⽂件去,再备份⽂件。
Oracle常用的数据类型
Oracle常⽤的数据类型(0) Oracle 数据类型varchar2:可变长字符数据char(size):定长字符数据number(p,s):可变长数值数据date:⽇期型数据long:可变长字符数据,最⼤可达到2Gclob:字符数据,最⼤可达到4GRAW(LONG RAW):原始的⼆进制数据BLOB:⼆进制数据,最⼤可达到4GBFILE:存储外部⽂件的⼆进制数据,最⼤可达到4GROWID:⾏地址(1)字符类型① • CHAR:⼀个定长字符串,当位数不⾜⾃动⽤空格填充来达到其最⼤长度。
如⾮NULL的CHAR(12)总是包含12字节信息。
CHAR字段最多可以存储2,000字节的信息。
② • VARCHAR2:⽬前这也是VARCHAR 的同义词。
这是⼀个变长字符串,与CHAR 类型不同,它不会⽤空格填充⾄最⼤长度。
VARCHAR2(12)可能包含0~12字节的信息。
VARCHAR2最多可以存储4,000 字节的信息。
CHAR和VARCHAR2的⽐较:CHAR(4) “A“ 实际在数据库中存储为"A “,“ABCDE”超长报错VARCHAR2(4) “A” 存储的还是“A”,“ABCDE”超长报错汉字:每个汉字占多少字节,要看具体的编码⽅式,如UTF-8(1-3字节)、GB2312(2字节)、GBK(2字节)、GB18030(1、2、4字节)(2)数字类型①• NUMBER:该数据类型能存储精度最多达38位的数字。
每个数存储在⼀个变长字段中,其长度在0~22字节之间。
的NUMBER类型精度很⾼,远远⾼于许多编程语⾔中常规的FLOAT和DOUBLE类型。
NUMBER( p,s ) p表⽰精度(总长度) s表⽰⼩数位置且四舍五⼊NUMBER(10,3) 10是总长度,3是⼩数位数的长度123.456123.4567 :将存储为123.45712345679.899 :精度超长了,10是总长度,3是⼩数位,整数位为10-3=7位NUMBER(10)==NUMBER(10,0) ng.IntegerNUMBER(19)==NUMBER(19,0) ng.Long(3)⽇期类型①• DATE:⼀个7字节的定宽⽇期/时间数据类型。
oracle的字段类型
0、LARGE OBJECTOracle8中有4种LOB- BLOB:Binary Large Object- CLOB:Character Large Object- NCLOB:固定长度的多字节Character Large Object- BFILE:DB外部的二进制文件它们分为两类:内部LOB:存放在DB内部,包括BLOB,CLOB,BCLOB外部文件:存放在DB外面,就是BFILE要注重的是ORACLE8不自动转换这些类型的数据。
1、LONG和LOB的比较LONG/LONG RAW LOB--------------------------------------------------表中只能由一个列可以有多列最大2G 最大4GSELECT返回值 SELECT返回指针存放在DB内可以在DB的内或者外不支持OBJECT类型支持顺序存取随机存取--------------------------------------------------NCLOB不支持OBJECT类型LOB小于4000字节时是内部存放2、LOB解析LOB有两个不同的部分- LOB值:LOB代表的数据- LOB指针:LOB存放数据的位置LOB列内部不存放数据,而是LOB值的位置。
当创建内部LOB时,值存放在LOB SEGMENT 中,指向OUT-OF-LIN数据的指针放在列中。
对外部LOB,只在列中存放位置。
3、内部LOB就是存放在DB内部的LOB,包括BLOB,CLOB,NCLOB。
它们可以是用户自定义的类型中的属性表中某列SQL 变量程序host变量PL/SQL中的变量、参数、返回值内部LOB可以使用ORACLE的并发机制、REDO LOG、RECOVERY机制。
BLOB被ORACLE8解释为二进制位流,类似LONG RAW。
CLOB解释为单字节字符流NCLOB是固定的多字节字符流,基于DB NATIONAL字符集的字节长度。
LOB数据类型说明
在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。
下面是对lob数据类型的简单介绍。
blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据库中。
clob:字符lob,字符数据,最长可以达到4GB,存贮在数据库中。
bfile:二进制文件;存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。
nclob:支持对字节字符集合(nultibyte characterset)的一个clob列。
对于如何检索和操作这些lob数据一直是oracle数据库开发者经常碰到的问题。
下面我将在oracle对lob数据处理的一些方法和技巧,介绍给读者,希望能够对读者以后的开发有所帮助。
Blob and Clob ORACLE中的大对象: 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。
对CLOB与BLOB对象的操作 1. 查询(GET)查询CLOBoracle中可以用多种方法来检索或操作lob数据。
通常的处理方法是通过dbms_lob包。
(Oracle)关于blob转到目标库报ORA-01461:仅能绑定要插入LONG列的LO。。。
(Oracle)关于blob转到⽬标库报ORA-01461:仅能绑定要插⼊LONG列的LO。
在数据抽取时,开发需要clob类型的数据,但是⽬标库类型是blob类型的,于是抽取的时候报错:ORA-01461: 仅能绑定要插⼊ LONG 列的 LONG 值错误可能有以下⼏种原因:可能有以下⼏种原因:1、插⼊到字符串长度⼤于4000字节。
2、插⼊到表中的记录的某个字段数据的实际长度⼤于2000个字节(如果是UTF-8,则是1333个字节);或者是插⼊的记录中有两个或两个以上长度⼤于2000字节的字符串。
3、数据库与客户端的JDBC 驱动不匹配。
对于UTF-8或欧洲的某些字符集,oracle在存储时,对于⼀个字符需要2个或3个字节的存储空间,虽然表定义中为varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。
这种情况下oracle会把data_length长度超过 4000的当做LONG型处理,你的表中有两个这样的字段,插⼊数据时相当于同时操作2个LONG字段。
4、使⽤9i的及以下的版本引发的bug. 10.1.0.1版本中已经修复bug我这边遇到的是第⼀种,字符串长度⼤于4000了。
解决⽅法:创建函数进⾏转换就可以了。
函数如下:CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB ASv_clob CLOB;v_varchar VARCHAR2(32767);v_start PLS_INTEGER := 1;v_buffer PLS_INTEGER := 32767;BEGINDBMS_LOB.CREATETEMPORARY(v_clob, TRUE);FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOPv_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in,v_buffer,v_start));DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);DBMS_OUTPUT.PUT_LINE(v_varchar);v_start := v_start + v_buffer;END LOOP;RETURN v_clob;END BlobToClob;blob转varcharCREATE OR REPLACE Function Blob_To_Varchar (Blob_In In Blob) Return Varchar2IsV_Varchar Varchar2(4000);V_Start Pls_Integer := 1;V_Buffer Pls_Integer := 4000;BeginIf Dbms_Lob.Getlength(Blob_In) Is Null ThenReturn '';End If;For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop--当转换出来的字符串乱码时,可尝试⽤注释掉的函数--V_Varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8')); V_Varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start));V_Start := V_Start + V_Buffer;End Loop;Return V_Varchar;End Blob_To_Varchar;。
Blob(二进制大对象)
Blob(⼆进制⼤对象)Blob(⼆进制⼤对象)Oracle LOB:LOB,即Large Objects(⼤对象),是⽤来存储⼤量的⼆进制和⽂本数据的⼀种数据类型(⼀个LOB字段可存储多达4GB的数据)。
LOB分为两种类型:内部LOB和外部LOB。
-内部LOB将数据以字节流的形式存储在数据库的内部。
因⽽,内部LOB的许多操作都可以参与事务,也可以像处理普通数据⼀样对其进⾏备份和恢复操作。
Oracle⽀持三种类型的内部LOB:·BLOB(⼆进制数据)·CLOB(单字节字符数据)·NCLOB(多字节字符数据)-CLOB和NCLOB类型适⽤于存储超长的⽂本数据,BLOB字段适⽤于存储⼤量的⼆进制数据,如图像、视频、⾳频,⽂件等。
-⽬前只⽀持⼀种外部LOB类型,即BFILE类型。
在数据库内,该类型仅存储数据在操作系统中的位置信息,⽽数据的实体以外部⽂件的形式存在于操作系统的⽂件系统中。
因⽽,该类型所表⽰的数据是只读的,不参与事务。
该类型可帮助⽤户管理⼤量的由外部程序访问的⽂件。
MySQL BLOB类型介绍:MySQL中,BLOB是⼀个⼆进制⼤型对象,是⼀个可以存储⼤量数据的容器,它能容纳不同⼤⼩的数据。
MySQL的四种BLOB类型(除了在存储的最⼤信息量上不同外,他们是等同的)类型⼤⼩(单位:字节)TinyBlob 最⼤ 255Blob 最⼤ 65 K 或 65535MediumBlob 最⼤ 16 M 或 16777215LongBlob 最⼤ 4 G 或 4294967295实际使⽤中根据需要存⼊的数据⼤⼩定义不同的BLOB类型。
需要注意的是:如果存储的⽂件过⼤,数据库的性能会下降。
使⽤JDBC来写⼊BLOB类型数据到Oracle中:oracle的blob字段⽐long字段的性能要好,可以⽤来保存如图⽚之类的⼆进制数据。
oracle的blob字段由两部分组成:数据(值)和指向数据的指针(定位器)。
oracle_字段类型
oracle 字段类型字段类型中文说明限制条件其它说明CHAR 固定长度字符串最大长度2000 bytesVARCHAR2 可变长度的字符串最大长度4000 bytes 可做索引的最大长度749NCHAR 根据字符集而定的固定长度字符串最大长度2000 bytesNVARCHAR2 根据字符集而定的可变长度字符串最大长度4000 bytesDATE 日期(日-月-年)DD-MM-YY(HH-MI-SS)经过严格测试,无千虫问题LONG 超长字符串最大长度2G(231-1)足够存储大部头著作RAW 固定长度的二进制数据最大长度2000 bytes 可存放多媒体图象声音等LONG RAW 可变长度的二进制数据最大长度2G 同上BLOB 二进制数据最大长度4GCLOB 字符数据最大长度4GNCLOB 根据字符集而定的字符数据最大长度4GBFILE 存放在数据库外的二进制数据最大长度4GROWID 数据表中记录的唯一行号10 bytes ********.****.****格式,*为0或1NROWID 二进制数据表中记录的唯一行号最大长度4000 bytesNUMBER(P,S) 数字类型P为整数位,S为小数位DECIMAL(P,S) 数字类型P为整数位,S为小数位INTEGER 整数类型小的整数FLOAT 浮点数类型NUMBER(38),双精度REAL 实数类型NUMBER(63),精度更高数据类型参数描述char(n) n=1 to 2000字节定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)varchar2(n) n=1 to 4000字节可变长的字符串,具体定义时指明最大长度n,这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。
如果数据长度没有达到最大值n,Oracle 8i会根据数据大小自动调节字段长度,如果你的数据前后有空格,Oracle 8i会自动将其删去。
关于oracle中clob字段查询慢的问题及解决方法
关于oracle中clob字段查询慢的问题及解决⽅法最近在⽤oracle的过程中⽤到了对blob字段模糊查询的问题,对oracle来说,我并不是⾼⼿,找了很多的资料终于能够查出来了。
blob字段直接⽤select * from table_name where column like ‘%%'查找的时候是不能实现的 ,主要是字段类型不符,就想到了字段转换成varchar2类型,然后再进⾏查询select * from table_name where utl_raw.cast_to_varchar2(column) like ‘%oracle%';但是却报如下的错误:在这之后作了修改:select * from table_name where utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(column,2000,1)) like '%oracle%' ;select * from table_name where dbms_lob.instr(column,utl_raw.cast_to_raw('所要匹配的内容'),1,1)<>0;这样就可以顺利的查找出来了。
以上只是⾃⼰做了个简单的处理,相信肯定有更好的⽅法,希望⼤家帮忙,但是感觉dbms_lob函数下的⽅法真的很好⽤。
oracle clob字段在查询很慢这是众所周知的还是要建⽴表的索引:create index search_idon table(字段)indextype is CTXSYS.CONTEXT;查询:select * from table where contains(字段,'内容',1)>0;后续:这样查询结果很快,但是查出来的数据不是我想要的,具体可能是程序的问题,不过这是解决查询clob字段慢的⼀个⽅法.希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
oracle long raw字段处理方法
Oracle long raw字段处理方法作者:[耿雷雨]时间:[2015.11.3]目录文件版本说明 (2)参考资料 (2)手册目的 (2)声明 (2)名词定义和缩略语说明 (2)1问题描述 (3)2解决办法 (3)2.1SQL方式 (3)2.2Kettle方式 (3)文件版本说明表 1 版本说明参考资料无手册目的记录日常工作中的问题,互相交流学习。
声明无名词定义和缩略语说明表 2 名词定义及缩略语说明1问题描述Long raw类型是oracle数据库的一个老的数据类型,属于不推荐使用的类型,这种类型的数据很难使用SQL进行操作。
在ETL过程中通过如果源库中存在long raw字段,通过一般存储过程或者抽取工具无法处理这种数据。
2解决办法针对long raw类型,一种方法可以在源库将这个字段转换成blob字段,这个需要我们能操作源库,一般没有这个权限。
另一种方法可以通过java脚本查询出数据后,将数据存储到blob字段中,这种方式一般的代码是单条处理,效率比较慢,而且独立于ETL工具和脚本。
可以将代码嵌入到ETL流程中,利用工具本身多线程并行特性加快执行效率。
2.1 SQL方式新建一张表列为blob类型,使用to_lob函数进行数据转换。
Insert into table2(id,zp) select id,to_lob(zp) from table1;2.2 Kettle方式一般情况下,只有源库查询权限。
通过dblink无法查询lob字段,第一种方式无法实现。
通过写java脚本结合kettle工具可以解决这个问题。
整体处理流程如下:表输入正常查询源表数据,预览数据时发现long raw字段列为一个很长的16进制字符串。
(最初时不清楚该字符串是什么编码,也不知如何将该字符串转成照片。
想到kettle 是java编写的,通过编写简单java类模拟表输入查询,确定了kettle内部使用的是哪个方法转换的long raw字段。