操作表为单表,可自行创建一个包含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--
分享到:
相关推荐
Java 访问 Oracle 中的 COLB 类型数据 Java 中访问 Oracle 数据库中的 COLB 类型数据是一种常见的操作。在实际开发中,我们经常需要处理大类型数据,如文本数据、图像数据等。Oracle 中的 COLB 类型数据可以存储大...
Oracle中的大型对象(LOB)是用于存储大量数据的特殊数据类型,包括BLOB(二进制大对象)和CLOB(字符大对象)。在Oracle数据库中,LOBs被设计用来处理超过4KB的文本、图像、音频或视频数据。本文通过Java代码示例...
它实现了Java Database Connectivity (JDBC) API,使得开发者可以使用Java语言来操作Oracle数据库,执行SQL语句,进行数据查询、插入、更新和删除等操作。Oracle JDBC驱动分为不同版本,包括 Thin、OCI、JDBC-ODBC ...
### PL/SQL存储过程编程详解 #### 一、Oracle应用编辑方法概览 在Oracle数据库的应用开发中,存在多种编辑方法和技术,它们各有特点和适用场景。以下是对这些方法的概述: 1. **Pro*C/C++**: 这是一种C语言与...
在PL/SQL中,当使用游标处理包含LOB的记录集时,需特别注意LOB的处理方式,避免内存溢出。可以使用`BULK COLLECT INTO`配合`FORALL`进行批量处理,以提高性能。 10. **版本兼容性**: Oracle数据库的不同版本可能...
2. **数据读取**:源代码可能包含使用Oracle的低级别接口,如PL/SQL包DBMS_LOB或Oracle的JDBC驱动,来读取和处理数据块。这可能涉及到LOB(Large Object)处理,因为大对象可能跨多个数据块。 3. **数据解析与转换*...
Oracle数据库中的CLOB(Character Large Object)类型是用来存储大量字符数据的,比如长文本、XML文档等。在Java中,当我们需要通过JDBC(Java Database Connectivity)接口与Oracle数据库交互时,处理CLOB字段可能...
7. 高级特性:如批处理、游标、调用存储过程、LOB(大型对象)处理、分布式事务等。 值得注意的是,ojdbc8.jar不包含对Oracle Object和Collection类型中的NLS(National Language Support)支持类。NLS是Oracle...
Oracle JDBC驱动程序,即Oracle Java Database Connectivity驱动,是Oracle数据库与Java应用程序之间的桥梁,使得Java开发者可以使用Java语言访问和操作Oracle数据库。`ojdbc14-10.2.0.4.0.jar`是Oracle公司提供的一...
- **SecureFile Lobs**:提供更安全的Lob存储方式。 - **Data Pump**:用于高效的数据导入导出。 - **Partitioning Enhancements**:改进分区表的支持。 #### 24. SQL Tuning相关知识点: - **表连接方式**:Inner...
Oracle Ojdbc6.jar驱动包是Oracle数据库连接Java应用程序的关键组件,它使得Java开发者能够通过Java Database Connectivity (JDBC) API与Oracle数据库进行交互。在Java应用程序中,JDBC驱动程序扮演着桥梁的角色,...
- 通过Java或.NET等开发语言调用存储过程或函数 #### 第二部分:PL/SQL块结构和组成元素 **2.1 PL/SQL块** PL/SQL块是PL/SQL程序的基本单位,每个块由三个部分组成: - **声明部分(DECLARE)**:定义变量、常量...
1. Oracle 中的 LOB (Large Object) 数据类型:LOBs用于存储大量非结构化数据,如文本、图像或音频文件。它们分为BLOB(Binary Large Object)用于二进制数据,CLOB(Character Large Object)用于字符数据,和NCLOB...
总的来说,Oracle OJDBC6.jar是Oracle数据库与Java应用程序交互的核心组件,它为开发者提供了丰富的功能和高效的性能,使得在Java环境中使用Oracle数据库变得简单而高效。11.2.0.3.0版本的发布,进一步提升了驱动的...
结果集(ResultSet)是JDBC中使用的一个对象,用于存储SQL查询返回的数据。 2. ORA-17014: ResultSet.next 这个错误表明在调用ResultSet.next()方法时发生了问题。可能是查询结果为空,或者在尝试获取结果集的下一...
在启动过程中,Oracle会读取初始化参数文件(Parameter file),加载控制文件,然后初始化SGA,最后启动后台进程。 在数据库管理中,密码文件用于限制哪些用户可以启动数据库实例,归档日志文件用于保存已满的重做...
- **过程调用**:通过EXECUTE调用存储过程。 - **参数传递**:IN、OUT、IN OUT参数。 #### 二十二、触发器 - **触发器类型**:BEFORE、AFTER、INSTEAD OF。 - **触发事件**:INSERT、UPDATE、DELETE等。 - **触发...
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...