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;
...
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7192724/viewspace-774362/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 陣列進行奇數和偶數操作 把奇數放在陣列前面 偶數放在陣列後面陣列
- MySQL中CHAR和VARCHAR區別MySql
- varchar和char的區別
- char ,varchar2和varchar的區別
- 談MySQL中char varchar區別MySql
- NTMySQL中varchar和char型別的區別heeMySql型別
- char和varchar2的區別
- C: (pointer) 陣列變數和指標的區別陣列變數指標
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- 為什麼使用型別化陣列來進行位元組操作而不是普通的 javascript 數字陣列型別陣列JavaScript
- C#中如何獲取二維陣列的行數和列數?C#陣列
- oracle中char與varchar2的區別Oracle
- char(n)和varchar2(n)區別
- char,nchar,varchar,nvarchar的區別和特點
- Oracle CHAR,VARCHAR,VARCHAR2,nvarchar型別的區別與使用Oracle型別
- string與char陣列相互轉換陣列
- char str[]和char *str的區別
- systemtap 探祕(三)- 型別、變數和陣列型別變數陣列
- matlab之size:返回矩陣的行數和列數Matlab矩陣
- 【基礎】Oracle CHAR,VARCHAR,VARCHAR2,nvarchar型別的區別與使用Oracle型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- 泛型程式設計(模板函式,模板類的套用) Myvector 具體案例 實現可存放int 陣列 char陣列 類物件陣列 以及一組指標泛型程式設計函式陣列物件指標
- c語言結構體中的一個char陣列怎麼賦值?C語言結構體陣列賦值
- Sql server char,nchar,varchar與Nvarchar的區別SQLServer
- JavaScript 使用sort()方法從數值上對陣列進行排序JavaScript陣列排序
- 陣列--移除陣列中指定的元素,不改變原陣列和改變原陣列陣列
- Mysql中varchar與char的區別以及varchar(30)中的30代表的涵義MySql
- 陣列進行排序的方法陣列排序
- 找一個陣列中特別的數陣列
- 當char型變數遇上char*型的指標變數指標
- 陣列filter方法對陣列元素進行過濾陣列Filter
- JS陣列中(for...in)和(for...of)的區別JS陣列
- 陣列中每個陣列元素出現的次數陣列
- 一維陣列a[5]中&a和a區別陣列
- 陣列的操作-變形陣列
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- 對陣列中的數字 1 和 2 進行排序,使得數字 1、2 分別位於前、後部分陣列排序
- 根據陣列中物件進行排序陣列物件排序