トレース ファイルに次のように表示されます。
Bind#3 oacdty=01 mxl=128(35) mxlc=36 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=31 siz=0 off=168
kxsbbbfp=ffffffff79f139a8 bln=128 avl= 35 flg=01 value="1234 W 1234 West, West Groves City"
mxlc 値とは何ですか?
引用します
Bind #n
oacdty - Datatype code
mxl - Maximum length of the bind variable value (private maximum length in parentheses)
mxlc - Unknown :(
mal - array length
scl - Scale
pre - Precision
oacflg - Special flag indicating bind options
fl2 - second part of oacflg
frm - Unknown :(
csi - Unknown :(
siz - Amount of memory to be allocated for this chunk
off - Offset into this chunk for this bind buffer
kxsbbbfp- Bind address
bln - Bind buffer length
avl - actual value length
flg - bind status flag
value - Value of the bind variable
本はまた引用します-
現在、3 つのパラメーターに関する情報はありません。
mxlc
、frm
、およびですcsi
。
概要
mxlc
バインド変数の最大文字数のように見えますが、変数が文字長セマンティクスを使用している場合のみです。
方法
My Oracle Support で を検索しましたmxlc
。ほとんどすべての記事には がありますがmxlc=00
、唯一の例外はNVARCHAR
またはNCHAR
です。以下のコードは、ドキュメント ID 552262.1 のコードに基づいています。可変サイズ (99
および) を変更し、文字長セマンティクスが使用されている場合は123 char
毎回可変サイズに設定しました。mxlc
コード
create table t1(ncol1 nvarchar2(100), col1 varchar2(100));
alter session set timed_statistics = true;
alter session set statistics_level=all;
alter session set max_dump_file_size = unlimited;
alter session set events '10046 trace name context forever,level 4';
VAR nvar1 NVARCHAR2(99)
VAR var1 VARCHAR2(123 char)
EXEC :nvar1 := 'nvarchar'
EXEC :var1 := 'varchar'
SELECT * FROM T1 WHERE ncol1 = :nvar1 and col1 = :var1;
ALTER SESSION SET EVENTS '10046 trace name context off';
結果:
Bind#0
oacdty=01 mxl=2000(198) mxlc=99 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=02 csi=2000 siz=4000 off=0
kxsbbbfp=0e702edc bln=2000 avl=16 flg=05
value=0 6e 0 76 0 61 0 72 0 63 0 68 0 61 0 72
Bind#1
oacdty=01 mxl=2000(369) mxlc=123 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=873 siz=0 off=2000
kxsbbbfp=0e7036ac bln=2000 avl=07 flg=01
value="varchar"
さらに質問を
通常、 と の関係は理mxl
にmxlc
かなっています。私のシステムの 、UTF16 の場合、NVARCHAR
1 文字あたり 2 バイト、つまり 198 と 99 になります。私のデータベースは UTF8 で、1 文字は最大 4 バイトです。おそらく、Oracle は平均サイズが 3 バイト、つまり 123 と 369 になると推測しています。明らかに 369 を超える可能性があります。おそらくそれは最初に割り当てられたメモリであり、後で大きくなる可能性があります。
しかし、あなたの数字、36 と 35 は私には意味がありません。バイト数が文字数よりも少なくなることはありませんか? オラクルは間違った推測をしていますか、それともクライアントプログラムが間違ったデータを送信していますか?