Proc中使用char数组、VARCHAR数组和char变量进行DELETE操作具体行数的细微区别

简介: EXEC SQL BEGIN DECLARE SECTION;char a[10000][3];VARCHAR b[10000][31];char c[3];EXEC SQL END DECLARE SECTION;.

EXEC SQL BEGIN DECLARE SECTION;
char a[10000][3];
VARCHAR b[10000][31];
char c[3];
EXEC SQL END DECLARE SECTION;

...

int delete_rows=10000;

...


1. CHAR类型数组变量

EXEC SQL for :delete_rows

delete FROM table_name

WHERE a= :a;

由于char对应于Oracle的char类型,因此若有空格,则此时char即使用memset初始化,但也会带有后面的空格,有可能造成delete时where a=:a由于空格不匹配无法删除,例如:a赋值为'a’,但数组长度是3,因此实际where条件是a='a ',因为空格导致不能删除。


2. VARCHAR类型数组变量

EXEC SQL for :delete_rows

delete FROM table_name

WHERE b= :b;

对于VARCHAR类型对应于Oracle的VARCHAR类型,因此不存在1中的空格问题,会自动滤掉空格,这是最好的一种匹配方法。

对于删除的数据量,会选择delete_rows与b数组的容量中最小的一个值。


3. CHAR类型变量

这里指的是char字符串变量,不是数组,此时使用:

EXEC SQL for :delete_rows

delete FROM table_name

WHERE c= :c;

由于c只是一个变量字符串,此时delete_rows会失效,只会执行一次该语句,有多少条删除多少条记录。


总结:

1. 对于VARCHAR类型数组,Oracle会根据指定删除行数的整数,与array host数组变量的容量之间,选择一个最小值,保证最小删除的行。

2. 对于CHAR类型字符串,就相当于一个常量,此时Oracle由于不能判断delete ... where c=:c;实际需要删除多少行,所以干脆也不判断了,就执行一次。开始我认为for :delete_rows类似于使用where rownum <= delete_rows,但这个场景是如此判断,想必不会是rownum这种方式做。


同理,UPDATE与DELETE相同。

另外,值得提一句,EXEC SQL BEGIN DECLARE SECTION;中char和VARCHAR类型可以不是二维数组,但其它类型的变量必须不能是这种二维数组。


参考:

The host variables in the WHERE clause must be either all scalars or all arrays. If they are scalars, Oracle executes the DELETE statement only once. If they are arrays, Oracle executes the statement once for each set of array components. Each execution may delete zero, one, or multiple rows.
Array host variables in the WHERE clause can have different sizes. In this case, the number of times Oracle executes the statement is determined by the smaller of the following values:
■The size of the smallest array
■The value of the :host_integer in the optional FOR clause

目录
相关文章
|
7月前
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
70 0
|
9天前
|
存储 数据库
5. CHAR和VARCHAR的区别?
`CHAR`和`VARCHAR`在数据库中有所不同:`CHAR`长度固定,用空格填充,存储效率高,英文占1字节,汉字占2字节;而`VARCHAR`长度可变,节省空间,英文和汉字都占2字节。
13 0
|
1月前
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
29 1
|
7月前
|
存储 SQL 数据库
char、varchar、nvarchar、text的区别
char、varchar、nvarchar、text的区别
33 0
|
4月前
从接口获取获取到数组arr=[‘1‘,‘a‘,‘2‘,‘b‘,‘3‘,‘c‘]转换成{number:‘123’,char:‘abc’}
从接口获取获取到数组arr=[‘1‘,‘a‘,‘2‘,‘b‘,‘3‘,‘c‘]转换成{number:‘123’,char:‘abc’}
|
4月前
|
存储 关系型数据库 MySQL
MySQL之varchar和char的区别
MySQL之varchar和char的区别
17 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL 总结char与varchar的区别
MySQL 总结char与varchar的区别
28 0
|
7月前
|
存储 关系型数据库 MySQL
MySql 字符串类型 - char、varchar
MySql 字符串类型 - char、varchar
56 0
|
7月前
|
存储
关于char类型数组的两种输出方法
关于char类型数组的两种输出方法
142 0
|
9月前
|
存储
char和varchar的区别(秒懂!)
char和varchar的区别(秒懂!)
86 0