操作表为单表,可自行创建一个包含LOB字段的表。
一、创建包
sql 代码
- CREATE OR REPLACE PACKAGE PAG_PRODUCT AS
- TYPE RESULT_CURSOR IS REF CURSOR;
-
-
- /*
- 保存一条产品信息
-
- P_NAME 产品名称
- P_GUIGE 产品规格
- P_CHANDI 产品产地
- P_TIHUODIAN 产品提货地点
- P_SHULIANG 产品数量
- P_ZUIXINJIAGE 产品最新价格
- P_MIAOSHU 产品描述
- P_IMG 产品图片 为BLOB类型
- P_ID 产品ID
- */
- PROCEDURE SAVEPRODECT_JFJS(P_NAME PRODUCT_JFJS.PRODUCT_NAME%TYPE,
- P_GUIGE PRODUCT_JFJS.PRODUCT_GUIGE%TYPE,
- P_CHANDI PRODUCT_JFJS.PRODUCT_CHANDI%TYPE,
- P_TIHUODIAN PRODUCT_JFJS.PRODUCT_TIHUODIAN%TYPE,
- P_SHULIANG PRODUCT_JFJS.PRODUCT_SHULIANG%TYPE,
- P_ZUIXINJIAGE PRODUCT_JFJS.PRODUCT_ZUIXINJIAGE%TYPE,
- P_MIAOSHU PRODUCT_JFJS.PRODUCT_MIAOSHU%TYPE,
- P_IMG PRODUCT_JFJS.PRODUCT_IMG%TYPE,
- P_ID OUT PRODUCT_JFJS.PRODUCT_ID%TYPE);
-
- END PAG_PRODUCT;
二、创建包体
sql 代码
- CREATE OR REPLACE PACKAGE BODY PAG_PRODUCT AS
-
-
- PROCEDURE SAVEPRODECT_JFJS(P_NAME PRODUCT_JFJS.PRODUCT_NAME%TYPE,
- P_GUIGE PRODUCT_JFJS.PRODUCT_GUIGE%TYPE,
- P_CHANDI PRODUCT_JFJS.PRODUCT_CHANDI%TYPE,
- P_TIHUODIAN PRODUCT_JFJS.PRODUCT_TIHUODIAN%TYPE,
- P_SHULIANG PRODUCT_JFJS.PRODUCT_SHULIANG%TYPE,
- P_ZUIXINJIAGE PRODUCT_JFJS.PRODUCT_ZUIXINJIAGE%TYPE,
- P_MIAOSHU PRODUCT_JFJS.PRODUCT_MIAOSHU%TYPE,
- P_IMG PRODUCT_JFJS.PRODUCT_IMG%TYPE,
- P_ID OUT PRODUCT_JFJS.PRODUCT_ID%TYPE) AS
- V_ID PRODUCT_JFJS.PRODUCT_ID%TYPE;
- DEST_BLOB PRODUCT_JFJS.PRODUCT_IMG%TYPE;
- BEGIN
- SELECT PRODUCT_PK_SEQ.NEXTVAL INTO V_ID FROM DUAL;
-
- INSERT INTO PRODUCT_JFJS
- (PRODUCT_ID,
- PRODUCT_NAME,
- PRODUCT_GUIGE,
- PRODUCT_CHANDI,
- PRODUCT_TIHUODIAN,
- PRODUCT_SHULIANG,
- PRODUCT_ZUIXINJIAGE,
- PRODUCT_FABUSHIJIAN,
- PRODUCT_MIAOSHU,
- PRODUCT_IMG)
- VALUES
- (V_ID,
- P_NAME,
- P_GUIGE,
- P_CHANDI,
- P_TIHUODIAN,
- P_SHULIANG,
- P_ZUIXINJIAGE,
- SYSDATE,
- P_MIAOSHU,
- EMPTY_BLOB());
- P_ID := V_ID;
- COMMIT;
- IF P_IMG IS NOT NULL THEN
- SELECT PRODUCT_JFJS.PRODUCT_IMG
- INTO DEST_BLOB
- FROM PRODUCT_JFJS
- WHERE PRODUCT_JFJS.PRODUCT_ID = P_ID
- FOR UPDATE;
- DBMS_LOB.COPY(DEST_BLOB, P_IMG, DBMS_LOB.GETLENGTH(P_IMG));
- COMMIT;
- END IF;
- EXCEPTION
- WHEN OTHERS THEN
- ROLLBACK;
- END;
-
- END PAG_PRODUCT;
SQL中若要添加LOB信息需要先新增一个空的LOB,调用
EMPTY_BLOB()或EMPTY_CLOB()函数。因此,在上例中我们INSERT的时候调用的是EMPTY_BLOB(),保存一个空的BLOB。然后再用LOB的处理函数来操作相关LOB。PK是通过SQL语句
sql 代码
-
- SELECT PRODUCT_PK_SEQ.NEXTVAL INTO V_ID FROM DUAL;
而产生的。最后调用函数DBMS_LOB.COPY()完成最终的赋值操作。
三、JAVA调用存储过程
以下为JAVA调用该过程的代码
java 代码
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public static Integer saveprodect_jfjs(String PRODUCT_NAME,
- String PRODUCT_GUIGE, String PRODUCT_CHANDI,
- String PRODUCT_TIHUODIAN, int PRODUCT_SHULIANG,
- String PRODUCT_ZUIXINJIAGE, String PRODUCT_MIAOSHU, File PRODUCT_IMG)
- throws SQLException, IOException {
-
-
-
-
- BLOB blob = new BLOB((OracleConnection) ConnectionUtil
- .getCurrentConnection(), FileUtil.getBytes(PRODUCT_IMG));
-
- InputStream inputStream = new FileInputStream(PRODUCT_IMG);
- Integer p_id = null;
- CallableStatement cstmt = null;
-
- cstmt = ConnectionUtil
- .prepareCall("PAG_PRODUCT.saveprodect_jfjs(?,?,?,?,?,?,?,?,?)");
-
- cstmt.setString(1, PRODUCT_NAME);
- cstmt.setString(2, PRODUCT_GUIGE);
- cstmt.setString(3, PRODUCT_CHANDI);
- cstmt.setString(4, PRODUCT_TIHUODIAN);
- cstmt.setInt(5, PRODUCT_SHULIANG);
- cstmt.setString(6, PRODUCT_ZUIXINJIAGE);
- cstmt.setString(7, PRODUCT_MIAOSHU);
-
- cstmt.setBinaryStream(8, inputStream, (int) blob.getLength());
-
- cstmt.registerOutParameter(9, Types.INTEGER);
-
- cstmt.execute();
-
- p_id = (Integer) cstmt.getObject(9);
-
- return p_id;
- }
END--
分享到:
相关推荐
CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB...
Oracle数据库中LOB的调优.pdf
Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt
Oracle中LOB字段的存储管理和优化.pdf
oracle dbms_lob
Oracle LOB字段处理工具是一款简单的lob字段处理工具
ORACLE LOB大对象处理.doc ORACLE LOB大对象处理.doc
分享一个来自官方的对Oracle LOB字段的性能调优。
oracle dbms_lob 智能大对象(Blob、Clob)
NULL 博文链接:https://surfingforrest.iteye.com/blog/711612
包含了官方权威说明。而且有LOB字段的日常维护总结,方便大家交流学习。
本文介绍如何操作oracle中的lob对象
VARCHAR2也是Oracle公司推荐使用的类型。但使用VARCHAR2有个问题:最大只能表示4000个字符,也就相当于2000个汉字。如果你的程序中某个字符的值要大于20002个汉字,用 VARCHAR2就不能满足要求了。这时候,你有两个...
测试oracle数据库中,lob字段在不同参数条件下,删除数据后占用空间的情况。 测试1 测试disable storage in row下的lob字段 测试2 测试非disable storage in row模式下 该模式为默认模式,既小于4k的数据不会存在lob...
只需要安装oracle client在本地,然后配置好tns,输入连接名,用户名,密码,数据表的名称,文件名数据列名以及blob数据列名,就可以批量导出ORACLE数据库BLOB字段生成图片
Oracle中对LOB对象的操作.pdf
java web 对clob大文本 blob图像处理 这是一个完整的例子,整合了ckeidtor,servlet直接显示数据库blob图片, 注意oracle驱动ojdbc14.jar,如果是其他驱动例如ojdbc14_*g都是不可以的。 表结构看hbm.xml配置文件 ...
结合开发应用Oracle数据库的实践经验编撰而成的,书中编排的内容次序非常适合于读者学习和把握Oracle的脉络,书中所选择的问题都是在实际开发应用Oracle过程中经常遇到和所要解决的。通过学习解决这些问题的方法,...
instr和substr存储过程,分析内部大对象的内容 instr函数 instr函数用于从指定的位置开始,从大型对象中查找第N个与模式匹配的字符串。 用于查找内部大对象中的字符串的instr函数语法如下: dbms_lob.instr( lob_...
NULL 博文链接:https://hackpro.iteye.com/blog/1845366