سؤال

وكنت أتساءل إذا كان هناك طريقة لربط أحد ArrayList (أو أي نوع من قائمة، لهذه المسألة) إلى PreparedStatement التي ستستخدم في نهاية المطاف إلى الوصول إلى قاعدة بيانات أوراكل. لقد وجدت:

PreparedStatement في بدائل الشرط؟

والذي يبدو مشابها لقضية بلدي، ولكن هذا السؤال هو أكثر تحديدا: أود أن ربط أحد ArrayList إلى PreparedStatement لاستخدامها في أوراكل، إذا كان ذلك ممكنا، وكيف يتم هذا إنجاز

هل كانت مفيدة؟

المحلول

وأنت لا يمكن ربط قائمة لمعلمة واحدة في بيان معد سلفا.

وتوليد SQL مع علامة معلمة لكل عنصر في القائمة، على سبيل المثال:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)

وعلى الرغم من أنك سوف تولد بيان جديد لكل الاستعلام، كنت لا تزال توصي باستخدام PreparedStatement. إذا احتوت القائمة الخاصة بك الحالات String، ستحصل على ما يلزم من الهروب للحماية من حقن SQL.

ولكن حتى لو كان نوع آمن، مثل الكائنات Integer، بعض السائقين أو الوسيطة يمكن تخزين PreparedStatements، والعودة مثيل مؤقتا إذا طلب نفس النموذج. بطبيعة الحال، فإن بعض التجارب تكون ضرورية. إذا القوائم تختلف اختلافا كبيرا في الحجم، سيكون لديك العديد من البيانات المختلفة، وعلى مخبأ تنفيذها سيئة قد لا تكون مستعدة للتعامل مع هذا العدد الكبير.

نصائح أخرى

وأنت لا يمكن ربط مباشرة. هل هناك طريقة لتمرير صفيف كمعلمة. ليس لدي أي فكرة عما تريد القيام به مع أنه على الجانب قاعدة بيانات حتى هذا قد لا تساعدك.

وأساسا، لديك لإنشاء نوع جدول متداخل في قاعدة البيانات؛ إنشاء كائن جافا القائمة على هذا النوع، الذي يحتوي على البيانات من مجموعة الخاص بك؛ ويمر من كمعلمة.

إذا قمت بإنشاء هذه الكائنات في قاعدة البيانات:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20);
CREATE TABLE my_table (a  my_nested_table) NESTED TABLE a STORE AS my_table_a;

وبعد ذلك يمكنك كتابة التعليمات البرمجية جافا مثل هذا:

String[] insertvalues = { "a", "b", "c" };
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES( ? )");
ARRAY insertParameter = new ARRAY( a_desc, conn, insertvalues );
p.setArray( 1, insertParameter );
p.execute();

والنتائج في أوراكل تبدو مثل هذا:

dev> select * from my_table;

A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')

حسنا، اذا حكمنا من خلال الإجابة على هذا واحد، وخاصة تصريحات لجوابي الخاطئة في هذا السؤال، لا يمكنك.

HTTP: // جافا. sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top