`
z7swf
  • 浏览: 186033 次
社区版块
存档分类
最新评论

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中的COLB类型数据.pdf

    Java 访问 Oracle 中的 COLB 类型数据 Java 中访问 Oracle 数据库中的 COLB 类型数据是一种常见的操作。在实际开发中,我们经常需要处理大类型数据,如文本数据、图像数据等。Oracle 中的 COLB 类型数据可以存储大...

    Oracle大型数据对象LOB几种情况的示范类

    Oracle中的大型对象(LOB)是用于存储大量数据的特殊数据类型,包括BLOB(二进制大对象)和CLOB(字符大对象)。在Oracle数据库中,LOBs被设计用来处理超过4KB的文本、图像、音频或视频数据。本文通过Java代码示例...

    oracle jdbc dirver

    它实现了Java Database Connectivity (JDBC) API,使得开发者可以使用Java语言来操作Oracle数据库,执行SQL语句,进行数据查询、插入、更新和删除等操作。Oracle JDBC驱动分为不同版本,包括 Thin、OCI、JDBC-ODBC ...

    PL/SQL存储过程编程

    ### PL/SQL存储过程编程详解 #### 一、Oracle应用编辑方法概览 在Oracle数据库的应用开发中,存在多种编辑方法和技术,它们各有特点和适用场景。以下是对这些方法的概述: 1. **Pro*C/C++**: 这是一种C语言与...

    oracle数据库的clob大字段在jdbc中的处理方式

    Oracle数据库中的CLOB(Character Large Object)类型是用来存储大量字符数据的,比如长文本、XML文档等。在Java中,当我们需要通过JDBC(Java Database Connectivity)接口与Oracle数据库交互时,处理CLOB字段可能...

    oracle Blob Clob 大数处理 代码

    在PL/SQL中,当使用游标处理包含LOB的记录集时,需特别注意LOB的处理方式,避免内存溢出。可以使用`BULK COLLECT INTO`配合`FORALL`进行批量处理,以提高性能。 10. **版本兼容性**: Oracle数据库的不同版本可能...

    oracle dul source code

    2. **数据读取**:源代码可能包含使用Oracle的低级别接口,如PL/SQL包DBMS_LOB或Oracle的JDBC驱动,来读取和处理数据块。这可能涉及到LOB(Large Object)处理,因为大对象可能跨多个数据块。 3. **数据解析与转换*...

    超详细Oracle教程.pdf

    - **调用存储过程**:介绍如何在PL/SQL或SQL环境中调用存储过程。 #### 二十二、触发器 - **触发器概念**:解释触发器的作用及其在Oracle数据库中的实现方式。 - **创建触发器**:教授如何使用CREATE TRIGGER语句...

    ojdbc8.jar

    7. 高级特性:如批处理、游标、调用存储过程、LOB(大型对象)处理、分布式事务等。 值得注意的是,ojdbc8.jar不包含对Oracle Object和Collection类型中的NLS(National Language Support)支持类。NLS是Oracle...

    oracle jdbc驱动 ojdbc14-10.2.0.4.0.jar工具

    Oracle JDBC驱动程序,即Oracle Java Database Connectivity驱动,是Oracle数据库与Java应用程序之间的桥梁,使得Java开发者可以使用Java语言访问和操作Oracle数据库。`ojdbc14-10.2.0.4.0.jar`是Oracle公司提供的一...

    ORACLE DBA面试题集

    - **SecureFile Lobs**:提供更安全的Lob存储方式。 - **Data Pump**:用于高效的数据导入导出。 - **Partitioning Enhancements**:改进分区表的支持。 #### 24. SQL Tuning相关知识点: - **表连接方式**:Inner...

    ojdbc6.jar

    Oracle Ojdbc6.jar驱动包是Oracle数据库连接Java应用程序的关键组件,它使得Java开发者能够通过Java Database Connectivity (JDBC) API与Oracle数据库进行交互。在Java应用程序中,JDBC驱动程序扮演着桥梁的角色,...

    PLSQL_Oracle 编程讲义

    - 通过Java或.NET等开发语言调用存储过程或函数 #### 第二部分:PL/SQL块结构和组成元素 **2.1 PL/SQL块** PL/SQL块是PL/SQL程序的基本单位,每个块由三个部分组成: - **声明部分(DECLARE)**:定义变量、常量...

    java开发面试笔试必知必会基础知识

    1. Oracle 中的 LOB (Large Object) 数据类型:LOBs用于存储大量非结构化数据,如文本、图像或音频文件。它们分为BLOB(Binary Large Object)用于二进制数据,CLOB(Character Large Object)用于字符数据,和NCLOB...

    oracle_ojdbc6.jar.src.zip

    总的来说,Oracle OJDBC6.jar是Oracle数据库与Java应用程序交互的核心组件,它为开发者提供了丰富的功能和高效的性能,使得在Java环境中使用Oracle数据库变得简单而高效。11.2.0.3.0版本的发布,进一步提升了驱动的...

    ORACLE 合辑

    - 在Java等编程语言中,通过PreparedStatement等API传递参数。 #### Sequence **概念及作用:** Sequence是一种用于生成连续整数序列的对象,在数据库中常用于为主键自动生成唯一值。它独立于表存在,但通常与特定...

    Oracle错误代码集合.pdf

    结果集(ResultSet)是JDBC中使用的一个对象,用于存储SQL查询返回的数据。 2. ORA-17014: ResultSet.next 这个错误表明在调用ResultSet.next()方法时发生了问题。可能是查询结果为空,或者在尝试获取结果集的下一...

    Oracle基础架构.pptx

    在启动过程中,Oracle会读取初始化参数文件(Parameter file),加载控制文件,然后初始化SGA,最后启动后台进程。 在数据库管理中,密码文件用于限制哪些用户可以启动数据库实例,归档日志文件用于保存已满的重做...

    超详细Oracle教程

    - **过程调用**:通过EXECUTE调用存储过程。 - **参数传递**:IN、OUT、IN OUT参数。 #### 二十二、触发器 - **触发器类型**:BEFORE、AFTER、INSTEAD OF。 - **触发事件**:INSERT、UPDATE、DELETE等。 - **触发...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

Global site tag (gtag.js) - Google Analytics