最近写存储过程,遇到一个问题,使用批量插入数据老是出错,说违反唯一性约束,最后检查存储过程,发现type table数据没有删除而引起的,存储过程如下:
type type_char2 is table of NVARCHAR2(30) index by binary_integer; --定义一个字符串的临时表类型
v_card_id type_char2;
--下面是游标
cursor cur_bt_data is
select * from test....;
--遍历游标
for bt_row in cur_bt_data loop
for i in 1 .. bt_row.confirm_quanlity loop
v_card_id(i) := to_number(bt_row.iccid_start)+i-1;
end loop;
forall i in 1 .. v_card_id.count
insert /*+ append */
into demo
(card_id,....)
values
(v_card_id(i),...);
commit;
end loop; -- [END]for 'cur_bt_data'
发现里面的v_card_id(i)问题,如果查询的 bt_row.confirm_quanlity 数量一样,循环初始化,数据应该没有问题,如果数量不一样,如,前一次查询的数量大,后一次的数量小,v_card_id没有初始化后面的,就可能出现重复的结果,所有每次循环都必须清理临时表
查了相关资料,只需要使用v_card_id.delete就删除临时表
修改如下:
for bt_row in cur_bt_data loop
v_card_id.delete;
for i in 1 .. bt_row.confirm_quanlity loop
..........
分享到:
相关推荐
在Oracle数据库环境中,使用现有的表结构来创建Type是一种常见的需求,尤其当涉及到复杂的数据类型时。根据提供的文件信息,本文将详细介绍如何利用Oracle中的表结构自动生成Type,并深入探讨其中涉及的关键概念和...
Oracle对象类型是Oracle数据库系统中面向对象编程的关键概念,它允许开发者定义自定义的数据结构,同时结合了数据和操作这些数据的方法。Oracle对象类型由两个主要部分构成:对象类型头和对象类型体。类型头定义了...
Oracle 中实现 Split 函数功能 Oracle 中实现 Split 函数功能是指在 Oracle 数据库中实现类似于 C# 等编程语言中的 Split 函数,用于拆分字符的功能。下面是实现 Oracle 中 Split 函数功能的详细介绍。 首先,...
在 Oracle 数据库中,将 Array 类型作为参数传递给存储过程是一种常见的操作,尤其是在需要处理大量数据时。Oracle 自身并没有内置的 Array 类型,但可以通过创建自定义的 Table 类型来模拟 Array 功能。以下是如何...
declare type v_table is table of varchar2(30) index by binary_integer; my_table v_table; 在上面的代码中,我们首先声明了一个可变数组类型 `v_table`,它可以存储任意数量的字符串元素。然后,我们创建了一个...
"使用Oracle Spatial对ArcSDE中的SDO_GEOMETRY类型数据进行空间操作" Oracle Spatial 是 Oracle 数据库中的一个空间数据处理组件,用于存储、管理和操作空间数据。ArcSDE 是一个空间数据引擎,用于存储和管理大规模...
- `i_number_default_type`: 指定Oracle中`NUMBER`类型的默认转换类型,默认为`decimal`。 - `i_auto_incretment_column_name`: 设置自增字段的名称规则,默认为`%ID`。 #### 函数实现 ```sql CREATE OR REPLACE ...
在 Oracle 中,SQL 语句可以分为两种类型:静态 SQL 和动态 SQL。静态 SQL 在编译期就已经确定,例如 SELECT 语句、INSERT 语句等。动态 SQL 则是在运行阶段才能确定,例如使用 EXECUTE IMMEDIATE 语句执行的 SQL ...
- **定义类型**: `type v_table is table of varchar2(30) index by binary_integer;` 定义了一个名为 `v_table` 的类型,它是一个通过BINARY_INTEGER索引的VARCHAR2(30)类型的表。 - **初始化数组**: `my_table v_...
TYPE TREE_TABLE IS TABLE OF SCOTT_TREE%ROWTYPE; -- 节点信息 PL/SQL LOOKUP LOOKUP; RECORDS TREE_TABLE; V_ID SCOTT_TREE.ID%TYPE; BEGIN SELECT ST.* BULK COLLECT INTO RECORDS FROM SCOTT_TREE ST ...
CREATE OR REPLACE PROCEDURE my_procedure (p_list IN MY_TYPE_TABLE) IS BEGIN -- 存储过程的逻辑,例如遍历数组并进行操作 END; ``` 2. **C#中创建Oracle连接和命令对象**: 使用Oracle.DataAccess.Client...
本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现返回自定义类型的处理方法。 #### Oracle自定义类型简介 Oracle支持用户自定义数据类型,这为复杂数据结构的应用提供了极大的便利。...
TYPE emp_dtl_rec IS RECORD ( emp_no NUMBER(4), ename VARCHAR2(20), dept_no NUMBER(2) ); emp_dtl emp_dtl_rec; BEGIN EXECUTE IMMEDIATE 'SELECT emp_no, ename, dept_no FROM emp WHERE emp_no = 7934...
TYPE ROWID_ARRAY IS TABLE OF ROWID INDEX BY BINARY_INTEGER; V_ROWID_ARRAY ROWID_ARRAY; CURSOR CUR_ROWID IS SELECT A.ROWID ROW_ID FROM B JOIN A ON A.KEYWORD = B.KEYWORD; ``` - `ROWID_ARRAY` 类型...
在Java中调用Oracle函数并处理返回的Oracle特定数据类型,如集合或索引表,通常涉及到Oracle的PL/SQL包和Java的JDBC驱动。以下是对这个主题的详细说明: 1. **Oracle索引表类型**: Oracle索引表是一种PL/SQL数据...
Oracle 数组是 Oracle 数据库中的一种复杂数据类型,可以存储多个元素。数组可以是固定大小的,也可以是可变大小的。在 Oracle 中,数组可以用来存储多个元素,并且可以对数组进行各种操作,例如遍历、插入、删除等...
TYPE my_text_table_type IS TABLE OF VARCHAR2(200) INDEX BY BINARY_INTEGER; l_text_table my_text_table_type; l_index NUMBER; BEGIN FOR emp_rec IN (SELECT * FROM emp) LOOP l_text_table(emp_rec....
在 Oracle 数据库中,需要添加 shape 字段,该字段类型为 SDO_GEOMETRY,数据库默认有该类型。添加到数据表中的语句如下: ALTER TABLE 表名 ADD (shape SDO_GEOMETRY); 二、给表 user_sdo_geom_metadata 添加数据...
在Oracle中,除了常见的单值数据类型(如 NUMBER、VARCHAR2等)外,还支持复合数据类型,这些类型可以存储更复杂的数据结构。主要有以下几种: - VARRAY(可变数组):VARRAY允许我们创建固定大小的数组,每个元素...