操作表为单表,可自行创建一个包含LOB字段的表。
一、创建包
二、创建包体
SQL中若要添加LOB信息需要先新增一个空的LOB,调用 EMPTY_BLOB()或 EMPTY_CLOB()函数。因此,在上例中我们INSERT的时候调用的是 EMPTY_BLOB(),保存一个空的BLOB。然后再用LOB的处理函数来操作相关LOB。PK是通过SQL语句
而产生的。最后调用函数
DBMS_LOB.COPY()完成最终的赋值操作。
三、JAVA调用存储过程
以下为JAVA调用该过程的代码
END--
一、创建包
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 代码
- --调用序列给PK赋值
- SELECT PRODUCT_PK_SEQ.NEXTVAL INTO V_ID FROM DUAL;
三、JAVA调用存储过程
以下为JAVA调用该过程的代码
java 代码
- /**
- * 添加一个产品
- * @param PRODUCT_NAME 产品名称
- * @param PRODUCT_GUIGE 产品规格
- * @param PRODUCT_CHANDI 产品产地
- * @param PRODUCT_TIHUODIAN 产品提货地点
- * @param PRODUCT_SHULIANG 产品数量
- * @param PRODUCT_ZUIXINJIAGE 产品最新价格
- * @param PRODUCT_MIAOSHU 产品描述
- * @param PRODUCT_IMG 产品显示图片,为FILE类型
- * @return
- * @throws SQLException
- * @throws IOException
- */
- 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 {
- /**首先创建一个ORACLE BLOB对象,注意BLOB类大为大写字母,ConnectionUtil.getCurrentConnection()实际上
- * 返回一个java.sql.Connection对象,FileUtil.getBytes(PRODUCT_IMG)返回一个File类型的byte数组,可用
- * 自己熟悉的方式来获得相关信息,这里是LIFERAY的封装。
- */
- BLOB blob = new BLOB((OracleConnection) ConnectionUtil
- .getCurrentConnection(), FileUtil.getBytes(PRODUCT_IMG));
- //创建一个READ操作的流
- InputStream inputStream = new FileInputStream(PRODUCT_IMG);
- Integer p_id = null;
- CallableStatement cstmt = null;
- //存储过程调用,调用saveprodect_jfjs过程
- 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);
- //传递存储过程的BLOB参数
- cstmt.setBinaryStream(8, inputStream, (int) blob.getLength());
- //注册返回值,返回保存后的产品PK值
- cstmt.registerOutParameter(9, Types.INTEGER);
- //调用执行
- cstmt.execute();
- //获得返回值
- p_id = (Integer) cstmt.getObject(9);
- return p_id;
- }