ORA-22835:บัฟเฟอร์มันเล็กเกินไปแล้ว ORA-25137:ข้อมูลค่าออกนอกระยะทาง

0

คำถาม

เรากำลังใช้ซอฟต์แวร์นั้นมีจำกัดสิทธิ์ความสามารถในการ. ฉันต้องการให้ตัวกรองผ่าน CLOB สนามโดยทำให้มั่นใจว่ามันเป็นเฉพาะเจาะจมูลค่าอยู่ ตามปกติข้างนอกของซอฟท์แวร์ตัวนี้ฉันจะทำอะไรอย่าง:

DBMS_LOB.SUBSTR(t.new_value) = 'Y'

อย่างไรก็ตามนี่ไม่ใช่การรองรับดังนั้นฉันพยายามจะใช้ CAST แทน ฉันพยายามหลายต่างพยายามแต่ตอนนี้นี่คือสิ่งที่ฉันพบ:

ซอฟท์แวร์ตัวนี้มีสร้าง query checker/ตัวตรวจความถูกต้องและเหล่านี้เป็นตัวเดียวกันกับที่มันแสดงที่ไม่ถูกต้อง:

DBMS_LOB.SUBSTR(t.new_value)
CAST(t.new_value AS VARCHAR2(10))
CAST(t.new_value AS NVARCHAR2(10))

อย่างไรก็ตามที่ตัวตรวจความถูกต้องนั่งยอมรับพวกนี้:

CAST(t.new_value AS VARCHAR(10))
CAST(t.new_value AS NVARCHAR(10))
CAST(t.new_value AS CHAR(10))

โชคร้ายถึงแม้ว่างที่ตัวตรวจความถูกต้องปล่อยให้พวกคนที่ผ่านไปตอนงานกับการค้นหาจะเรียกข้อมูลของฉันเข้าใจ ORA-22835: Buffer too small เมื่อใช้ VARCHAR หรือ NVARCHAR. และฉันเข้าใจ ORA-25137: Data value out of range เมื่อใช้ CHAR.

มีวิธีอื่นอีกฉันจะพยายามจะตรวจสอบว่าของฉัน CLOB สองมีเฉพาะค่าตอนที่กำลังกรองข้อมูล? ถ้าไม่ใช่ได้ยังไงฉันซ่อมของปัจจุบันปัญหา?

database oracle
2021-11-23 16:17:40
2

คำตอบที่ดีที่สุด

1

ข้อผิดพลาดนายกำลังจะแสดงให้เห็นสิทธิ์พยายามที่จะปรับใช้กา CAST(t.new_value AS VARCHAR(10)) ต้องเป็นแถวอยู่ไหน new_value มีมากกว่า 10 ตัวอักษร นั่นสมเหตุสมผลของคุณให้รายละเอียดนั่น new_value คือทั่วไปสนามรตรวจสอบบัญชีนั่นมีค่าของจากเป็นใหญ่จำนวนของแตกต่างตารางข้อมูลเรียบร้อยแล้วกับความหลากหลายของข้อมูลช่วงระยะเวลา. เพราะเหตุนั้นคุณจะต้องโครงสร้างการสืบค้นในแบบที่บังคับ optimizer ลดตั้งของแถวคุณกำลังปรับใช้คน cast ต้องลงเพื่อพวกนั้นอยู่ไหน new_value มีแค่คนเดียวอักขระก่อนที่กำลังปรับใช้คน cast.

ไม่รู้จักประเภทขอบเขตที่ซอฟต์แวร์คุณกำลังใช้อมู structuring รหัสของคุณฉันไม่แน่ใจว่าคุณมีตัวเลือกที่นั่น เป็นเรื่องนั้นขึ้นอยู่กับว่า robust คุณต้องการเรื่องนี้ optimizer มีค่อนข้างของความยืดหยุ่ต้องเลือกที่จะปรับใช้ predicates และฟังก์ชันบนภาพในการเผด็จการซะหน่อคำสั่ง ดังนั้นถึงแม้ว่าคุณหาวิธีที่ใช้งานได้ครั้งหนึ่งมันอาจจะหยุดทำงานในอนาคตเมื่อสถิติหรือเปลี่ยนฐานข้อมูลคืออัพเกรงและสิทธิ์ตัดสินใจเลือกต่างออกแผน

2021-11-24 16:59:52
0

ใช้มันเป็นตัวอย่างข้อมูล

create table tab1(col clob);
insert into tab1(col) values (rpad('x',3000,'y'));

คุณต้องการที่จะใช้ dbms_lob.substr(col,1) ต้องไป ก่อน อักขระ(จากค่าปริยาย offset=1)

select dbms_lob.substr(col,1) from tab1;

DBMS_LOB.SUBSTR(COL,1)
----------------------
x

โปรดจำไว้ว่า ค่าปริยาย amount (=ความยาว)ของส่วนข้อความอยู่ว่าคือ 32767 ดังนั้นใช้เท่านั้น DBMS_LOB.SUBSTR(COL) จะกลับมามากกว่าที่คุณคาดหวังให้.

CAST สำหรับ CLOB ยัง ไม่ได้ ตัด ที่ข้อความที่ casted ความยาวแต่ว่า(อย่างที่คุณ observes)จะคืนค่ากลับมาเป็นข้อยกเว้น ORA-25137: Data value out of range ถ้าดั้งเดิมข้อความ longert ว่า casted ความยาว.

เป็นได้บันทึกสำหรับ CAST คำให้การ

แสดงไม่ได้สนับสนุนโดยตรงไหนของ LOB ประเภทข้อมูล. ตอนที่คุณใช้แสดงที่จะแปลงเป็น CLOB ค่าให้เป็นอักขระข้อมูลประเภทหรือแก้จุดเหลือคุณค่าในข้อมูลประเภทที่ฐานข้อมูล implicitly converts ที่ LOB เพื่อให้น้องสาวไปค้นหาตัวละครหรือข้อมูลและจากนั้นในข้อบังคับ casts นผลลัพธ์จากค่าในเป้าหมายข้อมูลประเภทนี้ได้นะ ถ้าผลลัพธ์จากคืนค่ากว้างใหญ่กว่าเป้าหมายประเภทนั้นฐานข้อมูลกลับมาเป็นข้อผิดพลาด

2021-11-23 17:06:33

โชคร้ายที่แม้แต่หลังจากการเพิ่มที่ออฟเซ็ตระบการค้นหาตัวตรวจความถูกต้องไม่รู้จัก DBMS_LOB.SUBSTR() ดังนั้นฉันจึงไม่สามารถใช้มัน. ฉันคิดว่า CAST เป็นสามารถตัดข้อความเพราะว่าเรายังต้องใช้สำหรับ workaround TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) และมันได้ผล มันจะจัดการเวลาส่วน. ฉันหวังว่าเราสามารถ\ทำอะไรบางอย่างที่คล้ายกันสำหรับเรื่องนี้
Patrick Gregorio

ใช่มันทำงานสำหรับ VARCHAR แต่ unfortunatelly ไม่ใช่สำหรับ CLOB ฉันปรับคำตอบ @PatrickGregorio
Marmite Bomber

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่