[20190612]NULL的資料型別.txt
[20190612]NULL的資料型別.txt
--//前幾天聽別人講了NULL的資料型別導致產生大量子游標的案例,java的程式,我檢索看到類似連結:
--//http://www.usn-it.de/index.php/2010/08/04/oracle112-mutex-s-too-many-child-cursors/
. setNUMBER(2) => Bind Var. is number
. setNULL(2, java.sql.Types.INTEGER) => Bind Var. is NUMBER
but setNUMBER(2) => Bind Var. is varchar2.
But simply using setNull by default means setNull.NULL, and in both cases the setter method will not automatically use
the data type of the field in the table. Instead, the default is VARCHAR2, and exactly this makes my datatype different
to previous executions! So in theory, setting over 30 numeric values to null and non-null in an alternating matter,
creates 2^30 child cursors. Nice.
--//我不熟悉java程式設計,似乎講使用setNull定義的預設型別是VARCHAR2,應該寫成類似setNULL(2, java.sql.Types.INTEGER)的形式,才
--//能返回整形的NULL。
--//我記得以前yangtingkun講過關於NULL的資料型別的一些例子,自己拿sqlplus驗證看看:
1.環境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
-------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
SCOTT@test01p> create table t as select rownum id1 ,rownum id2 from dual connect by level<=10;
Table created.
SCOTT@test01p> variable v_id2 number ;
SCOTT@test01p> exec :v_id2 := null ;
PL/SQL procedure successfully completed.
SCOTT@test01p> update /*+ find_me */ t set id2 =:v_id2 where id1=3;
1 row updated.
SCOTT@test01p> rollback ;
Rollback complete.
SCOTT@test01p> variable v_id2 varchar2(10) ;
SCOTT@test01p> exec :v_id2 := null ;
PL/SQL procedure successfully completed.
SCOTT@test01p> update /*+ find_me */ t set id2 =:v_id2 where id1=3;
1 row updated.
SCOTT@test01p> rollback ;
Rollback complete.
--//確定:sql_id=3mwwz3vay4zn7.
2.看看是否產生子游標:
SCOTT@test01p> select sql_id,sql_text,child_number,executions from v$sql where sql_id='3mwwz3vay4zn7';
SQL_ID SQL_TEXT CHILD_NUMBER EXECUTIONS
------------- ------------------------------------------------------------ ------------ ----------
3mwwz3vay4zn7 update /*+ find_me */ t set id2 =:v_id2 where id1=3 0 1
3mwwz3vay4zn7 update /*+ find_me */ t set id2 =:v_id2 where id1=3 1 1
SCOTT@test01p> @ share 3mwwz3vay4zn7
SQL_TEXT = update /*+ find_me */ t set id2 =:v_id2 where id1=3
SQL_ID = 3mwwz3vay4zn7
ADDRESS = 000007FEFFB24E10
CHILD_ADDRESS = 000007FF1184DB48
CHILD_NUMBER = 0
REASON = <ChildNode><ChildNumber>0</ChildNumber><ID>39</ID><reason>Bind
mismatch(8)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>3</original_oacflg><original_oacdty>2</original_oacdty><new_oacdty>1</new_oacdty></ChildNode>
--------------------------------------------------
SQL_TEXT = update /*+ find_me */ t set id2 =:v_id2 where id1=3
SQL_ID = 3mwwz3vay4zn7
ADDRESS = 000007FEFFB24E10
CHILD_ADDRESS = 000007FF11C97D58
CHILD_NUMBER = 1
REASON = <ChildNode><ChildNumber>1</ChildNumber><ID>39</ID><reason>Bind
mismatch(8)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>3</original_oacflg><original_oacdty>1</original_oacdty><new_oacdty>2</new_oacdty></ChildNode>
--------------------------------------------------
PL/SQL procedure successfully completed.
--//不能共享的原因是Bind mismatch.可以發現如果update欄位許多型別是number,按照上面的程式設計設定NULL(指使用setnull(N))會出現大量的子游標.
--//可以看出即使是NULL也是有資料型別的,不一致也會導致產生子游標.繼續測試:
SCOTT@test01p> variable v_id2 number ;
SCOTT@test01p> exec :v_id2 := 2 ;
PL/SQL procedure successfully completed.
SCOTT@test01p> update /*+ find_me */ t set id2 =:v_id2 where id1=3;
1 row updated.
SCOTT@test01p> rollback ;
Rollback complete.
SCOTT@test01p> select sql_id,sql_text,child_number,executions from v$sql where sql_id='3mwwz3vay4zn7';
SQL_ID SQL_TEXT CHILD_NUMBER EXECUTIONS
------------- ---------------------------------------------------- ------------ ----------
3mwwz3vay4zn7 update /*+ find_me */ t set id2 =:v_id2 where id1=3 0 2
3mwwz3vay4zn7 update /*+ find_me */ t set id2 =:v_id2 where id1=3 1 1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2647588/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- NULL的資料型別(二)Null資料型別
- JavaScript基本資料型別之undefined和nullJavaScript資料型別UndefinedNull
- 關於0轉成null時資料型別Null資料型別
- 【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別SQLNull函式資料型別資料庫
- SCSS Null 型別CSSNull型別
- c#如何宣告資料結構型別為null?C#資料結構型別Null
- JS 的型別(null 和 undefined 的區別)JS型別NullUndefined
- TypeScript Null和Undefined 型別TypeScriptNullUndefined型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- 資料型別: 資料型別有哪些?資料型別
- Databricks 第9篇:Spark SQL 基礎(資料型別、NULL語義)SparkSQL資料型別Null
- Java中的基本資料型別與引用資料型別Java資料型別
- 強資料型別和弱資料型別資料型別
- 區別值型別資料和引用型別資料型別
- [20161123]oracle資料塊型別.txtOracle型別
- [20160624]慎用nvarchar2資料型別.txt資料型別
- 資料型別,型別轉換資料型別
- MySQL 的資料型別MySql資料型別
- JS的資料型別JS資料型別
- javaScript的資料型別JavaScript資料型別
- SQLServer的資料型別SQLServer資料型別
- MySQL的資料型別MySql資料型別
- 資料型別資料型別
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-有限制的子型別SQL資料型別
- PLSQL Language Referenc-SQL資料型別-子型別與基型別具有相同的資料型別家族SQL資料型別
- mongodb_資料型別(null/字串/數字/日期/內嵌文件/陣列等)MongoDB資料型別Null字串陣列
- JS中其他資料型別轉為number資料型別的方法JS資料型別
- SSIS 資料型別 第二篇:變數的資料型別資料型別變數
- 資料型別是什麼?Python的資料型別又有哪些?資料型別Python
- SQL資料型別和C#資料型別間的轉換SQL資料型別C#
- 3. php資料型別、資料型別轉換PHP資料型別
- JAVA中基本資料型別和引用資料型別Java資料型別
- TreeSet的null值與元素型別的約束Null型別
- 基本資料型別與字串型別資料型別字串
- 基本資料型別與API引用型別的使用資料型別API
- [20160619]NULL在資料庫的儲存.txtNull資料庫
- oracle中date資料型別與timestamp資料型別的轉換Oracle資料型別