अन्य सुविधाओं की तरह जो काम नहीं करती आपको अवश्य पढ़ना चाहिए दस्तावेज़ीकरण उनका उपयोग करने से पहले।
महत्वपूर्ण बात खिड़की की धारणा है
इसलिए प्रत्येक पंक्ति के परिवर्तन को देखने के लिए, आपको लाने का आकार . सेट करना होगा से 1.
ध्यान दें कि यह resultSet . के लिए फ़ेच आकार सेट करने के लिए पर्याप्त नहीं है , क्योंकि डिफ़ॉल्ट फ़ेच आकार 10 है और परिवर्तन केवल 11वीं और उसके बाद की पंक्तियों के लिए मान्य है।
इसलिए लाने का आकार prepareStatement
. पर सेट होना चाहिए :
def stmt = con.prepareStatement("""select id, val from test
where id between ? and ? order by id""", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)
stmt.setFetchSize(1)
// set bind variables and execute statement
अब rs.next()
. के हर कॉल पर एक नई विंडो खोली जाती है, जो refreshRow
जो डेटाबेस से वर्तमान मान प्राप्त करता है।
ध्यान दें कि यह व्यवहार केवल TYPE_SCROLL_SENSITIVE
के लिए किया जाता है TYPE_SCROLL_INSENSITIVE
. के लिए नहीं refreshRow
कहा जाता है, इसलिए आप प्रारंभिक क्वेरी के निरंतर डेटा देखते हैं, भले ही आप विंडो स्विच कर रहे हों। आप refreshRow
. पर कॉल कर सकते हैं स्पष्ट रूप से समान प्रभाव देखने के लिए।
तकनीकी रूप से कार्यक्षमता दो कर्सर का उपयोग करके कार्यान्वित की जाती है। पहला वाला इस्तेमाल की गई क्वेरी से मेल खाता है, केवल ROWID कॉलम जोड़ रहा है।
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
प्रत्येक विंडो स्विच पर कॉल किया गया दूसरा कर्सर (यानी प्राप्त की गई प्रत्येक पंक्ति के लिए फ़ेच आकार =1 के लिए) साधारण बाहरी सहेजे गए rowid
में शामिल हो जाता है वर्तमान डेटा को फिर से लाने के लिए पहले कर्सर से क्वेरी के साथ।
WITH "__JDBC_ROWIDS__" AS (SELECT COLUMN_VALUE ID, ROWNUM NUM FROM TABLE(:1 ))
SELECT "__JDBC_ORIGINAL__".*
FROM (select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :2 and :3 order by id) "__JDBC_ORIGINAL__", "__JDBC_ROWIDS__"
WHERE "__JDBC_ORIGINAL__"."__Oracle_JDBC_internal_ROWID__"(+) = "__JDBC_ROWIDS__".ID
ORDER BY "__JDBC_ROWIDS__".NUM
वहाँ समान प्रश्न हैं, लेकिन उनमें से कोई भी वास्तव में समस्या की व्याख्या नहीं करता है, इसलिए मैं इस प्रश्न को डुप्लिकेट के रूप में चिह्नित नहीं करता:
ResultSet का व्यवहार।TYPE_SCROLL_SENSITIVE
JDBC ResultSet Type_Scroll_Sensitive
JDBC परिणाम सेट प्रकार स्क्रॉल संवेदनशील
संक्षिप्त उत्तर यह है कि आपके द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट फ़ेच आकार एकल पंक्ति के अपडेट को देखने के लिए उच्च है ।
परीक्षण Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
. पर किया गया था DriverVersion 12.2.0.1.0