Java调用ORACLE中LOB参数的存储过程返回记录集

操作表为单表,可自行创建一个包含LOB字段的表。
一、创建包
sql 代码
  1. CREATE OR REPLACE PACKAGE PAG_PRODUCT AS
  2. TYPE RESULT_CURSOR IS REF CURSOR;
  3. /*
  4. 保存一条产品信息
  5. P_NAME 产品名称
  6. P_GUIGE 产品规格
  7. P_CHANDI 产品产地
  8. P_TIHUODIAN 产品提货地点
  9. P_SHULIANG 产品数量
  10. P_ZUIXINJIAGE 产品最新价格
  11. P_MIAOSHU 产品描述
  12. P_IMG 产品图片 为BLOB类型
  13. P_ID 产品ID
  14. */
  15. PROCEDURE SAVEPRODECT_JFJS(P_NAME PRODUCT_JFJS.PRODUCT_NAME%TYPE,
  16. P_GUIGE PRODUCT_JFJS.PRODUCT_GUIGE%TYPE,
  17. P_CHANDI PRODUCT_JFJS.PRODUCT_CHANDI%TYPE,
  18. P_TIHUODIAN PRODUCT_JFJS.PRODUCT_TIHUODIAN%TYPE,
  19. P_SHULIANG PRODUCT_JFJS.PRODUCT_SHULIANG%TYPE,
  20. P_ZUIXINJIAGE PRODUCT_JFJS.PRODUCT_ZUIXINJIAGE%TYPE,
  21. P_MIAOSHU PRODUCT_JFJS.PRODUCT_MIAOSHU%TYPE,
  22. P_IMG PRODUCT_JFJS.PRODUCT_IMG%TYPE,
  23. P_ID OUT PRODUCT_JFJS.PRODUCT_ID%TYPE);
  24. END PAG_PRODUCT;

二、创建包体
sql 代码
  1. CREATE OR REPLACE PACKAGE BODY PAG_PRODUCT AS
  2. PROCEDURE SAVEPRODECT_JFJS(P_NAME PRODUCT_JFJS.PRODUCT_NAME%TYPE,
  3. P_GUIGE PRODUCT_JFJS.PRODUCT_GUIGE%TYPE,
  4. P_CHANDI PRODUCT_JFJS.PRODUCT_CHANDI%TYPE,
  5. P_TIHUODIAN PRODUCT_JFJS.PRODUCT_TIHUODIAN%TYPE,
  6. P_SHULIANG PRODUCT_JFJS.PRODUCT_SHULIANG%TYPE,
  7. P_ZUIXINJIAGE PRODUCT_JFJS.PRODUCT_ZUIXINJIAGE%TYPE,
  8. P_MIAOSHU PRODUCT_JFJS.PRODUCT_MIAOSHU%TYPE,
  9. P_IMG PRODUCT_JFJS.PRODUCT_IMG%TYPE,
  10. P_ID OUT PRODUCT_JFJS.PRODUCT_ID%TYPE) AS
  11. V_ID PRODUCT_JFJS.PRODUCT_ID%TYPE;
  12. DEST_BLOB PRODUCT_JFJS.PRODUCT_IMG%TYPE;
  13. BEGIN
  14. SELECT PRODUCT_PK_SEQ.NEXTVAL INTO V_ID FROM DUAL;
  15. INSERT INTO PRODUCT_JFJS
  16. (PRODUCT_ID,
  17. PRODUCT_NAME,
  18. PRODUCT_GUIGE,
  19. PRODUCT_CHANDI,
  20. PRODUCT_TIHUODIAN,
  21. PRODUCT_SHULIANG,
  22. PRODUCT_ZUIXINJIAGE,
  23. PRODUCT_FABUSHIJIAN,
  24. PRODUCT_MIAOSHU,
  25. PRODUCT_IMG)
  26. VALUES
  27. (V_ID,
  28. P_NAME,
  29. P_GUIGE,
  30. P_CHANDI,
  31. P_TIHUODIAN,
  32. P_SHULIANG,
  33. P_ZUIXINJIAGE,
  34. SYSDATE,
  35. P_MIAOSHU,
  36. EMPTY_BLOB());
  37. P_ID := V_ID;
  38. COMMIT;
  39. IF P_IMG IS NOT NULL THEN
  40. SELECT PRODUCT_JFJS.PRODUCT_IMG
  41. INTO DEST_BLOB
  42. FROM PRODUCT_JFJS
  43. WHERE PRODUCT_JFJS.PRODUCT_ID = P_ID
  44. FOR UPDATE;
  45. DBMS_LOB.COPY(DEST_BLOB, P_IMG, DBMS_LOB.GETLENGTH(P_IMG));
  46. COMMIT;
  47. END IF;
  48. EXCEPTION
  49. WHEN OTHERS THEN
  50. ROLLBACK;
  51. END;
  52. END PAG_PRODUCT;

SQL中若要添加LOB信息需要先新增一个空的LOB,调用 EMPTY_BLOB()或 EMPTY_CLOB()函数。因此,在上例中我们INSERT的时候调用的是 EMPTY_BLOB(),保存一个空的BLOB。然后再用LOB的处理函数来操作相关LOB。PK是通过SQL语句
sql 代码
  1. --调用序列给PK赋值
  2. SELECT PRODUCT_PK_SEQ.NEXTVAL INTO V_ID FROM DUAL;
而产生的。最后调用函数
DBMS_LOB.COPY()完成最终的赋值操作。

三、JAVA调用存储过程
以下为JAVA调用该过程的代码

java 代码
  1. /**
  2. * 添加一个产品
  3. * @param PRODUCT_NAME 产品名称
  4. * @param PRODUCT_GUIGE 产品规格
  5. * @param PRODUCT_CHANDI 产品产地
  6. * @param PRODUCT_TIHUODIAN 产品提货地点
  7. * @param PRODUCT_SHULIANG 产品数量
  8. * @param PRODUCT_ZUIXINJIAGE 产品最新价格
  9. * @param PRODUCT_MIAOSHU 产品描述
  10. * @param PRODUCT_IMG 产品显示图片,为FILE类型
  11. * @return
  12. * @throws SQLException
  13. * @throws IOException
  14. */
  15. public static Integer saveprodect_jfjs(String PRODUCT_NAME,
  16. String PRODUCT_GUIGE, String PRODUCT_CHANDI,
  17. String PRODUCT_TIHUODIAN, int PRODUCT_SHULIANG,
  18. String PRODUCT_ZUIXINJIAGE, String PRODUCT_MIAOSHU, File PRODUCT_IMG)
  19. throws SQLException, IOException {
  20. /**首先创建一个ORACLE BLOB对象,注意BLOB类大为大写字母,ConnectionUtil.getCurrentConnection()实际上
  21. * 返回一个java.sql.Connection对象,FileUtil.getBytes(PRODUCT_IMG)返回一个File类型的byte数组,可用
  22. * 自己熟悉的方式来获得相关信息,这里是LIFERAY的封装。
  23. */
  24. BLOB blob = new BLOB((OracleConnection) ConnectionUtil
  25. .getCurrentConnection(), FileUtil.getBytes(PRODUCT_IMG));
  26. //创建一个READ操作的流
  27. InputStream inputStream = new FileInputStream(PRODUCT_IMG);
  28. Integer p_id = null;
  29. CallableStatement cstmt = null;
  30. //存储过程调用,调用saveprodect_jfjs过程
  31. cstmt = ConnectionUtil
  32. .prepareCall("PAG_PRODUCT.saveprodect_jfjs(?,?,?,?,?,?,?,?,?)");
  33. //参数设定
  34. cstmt.setString(1, PRODUCT_NAME);
  35. cstmt.setString(2, PRODUCT_GUIGE);
  36. cstmt.setString(3, PRODUCT_CHANDI);
  37. cstmt.setString(4, PRODUCT_TIHUODIAN);
  38. cstmt.setInt(5, PRODUCT_SHULIANG);
  39. cstmt.setString(6, PRODUCT_ZUIXINJIAGE);
  40. cstmt.setString(7, PRODUCT_MIAOSHU);
  41. //传递存储过程的BLOB参数
  42. cstmt.setBinaryStream(8, inputStream, (int) blob.getLength());
  43. //注册返回值,返回保存后的产品PK值
  44. cstmt.registerOutParameter(9, Types.INTEGER);
  45. //调用执行
  46. cstmt.execute();
  47. //获得返回值
  48. p_id = (Integer) cstmt.getObject(9);
  49. return p_id;
  50. }
END--

你可能感兴趣的:(java,oracle,sql)