दुर्भाग्य से, Oracle JDBC ड्राइवर PL/SQL RECORD
तक पहुँच प्रदान नहीं करता है टाइप करें, न तो IN
. के लिए न ही OUT
. के लिए पैरामीटर।
एकल प्रक्रिया कॉल के लिए समाधान:
लेकिन आप सीधे JDBC (या स्प्रिंग JDBC) में एक अनाम PL/SQL ब्लॉक का उपयोग करके इस सीमा के आसपास काम कर सकते हैं:
DECLARE
rec MY_PACKAGE.MY_RECORD;
BEGIN
-- Replace these by your actual record attributes:
rec.first_name := ?;
rec.last_name := ?;
...
p_insertclient(rec);
END;
यह एकल प्रक्रिया कॉल के लिए पूरी तरह से ठीक काम करता है।
इनमें से कई कॉलों के लिए ठोस समाधान:
यदि आप उपरोक्त को बार-बार करते हैं, तो यह स्टब्स उत्पन्न करने के लायक है जो गुमनाम पीएल/एसक्यूएल स्ट्रिंग्स को हर समय मैन्युअल रूप से लिखने के बजाय स्वचालित रूप से उत्पन्न करते हैं। आप स्वचालित रूप से सभी पीएल/एसक्यूएल RECORD
की खोज कर सकते हैं निम्न क्वेरी के साथ अपने स्कीमा में टाइप करें:
SELECT
x.TYPE_OWNER, x.TYPE_NAME, x.TYPE_SUBNAME, a.ARGUMENT_NAME ATTR_NAME,
a.SEQUENCE ATTR_NO, a.TYPE_OWNER ATTR_TYPE_OWNER,
nvl2(a.TYPE_SUBNAME, a.TYPE_NAME, NULL) package_name,
COALESCE(a.TYPE_SUBNAME, a.TYPE_NAME, a.DATA_TYPE) ATTR_TYPE_NAME,
a.DATA_LENGTH LENGTH, a.DATA_PRECISION PRECISION, a.DATA_SCALE SCALE
FROM SYS.ALL_ARGUMENTS a
JOIN (
SELECT
a.TYPE_OWNER, a.TYPE_NAME, a.TYPE_SUBNAME,
MIN(a.OWNER) KEEP (DENSE_RANK FIRST ORDER BY a.OWNER ASC, a.PACKAGE_NAME ASC, a.SUBPROGRAM_ID ASC, a.SEQUENCE ASC) OWNER,
MIN(a.PACKAGE_NAME) KEEP (DENSE_RANK FIRST ORDER BY a.OWNER ASC, a.PACKAGE_NAME ASC, a.SUBPROGRAM_ID ASC, a.SEQUENCE ASC) PACKAGE_NAME,
MIN(a.SUBPROGRAM_ID) KEEP (DENSE_RANK FIRST ORDER BY a.OWNER ASC, a.PACKAGE_NAME ASC, a.SUBPROGRAM_ID ASC, a.SEQUENCE ASC) SUBPROGRAM_ID,
MIN(a.SEQUENCE) KEEP (DENSE_RANK FIRST ORDER BY a.OWNER ASC, a.PACKAGE_NAME ASC, a.SUBPROGRAM_ID ASC, a.SEQUENCE ASC) SEQUENCE,
MIN(next_sibling) KEEP (DENSE_RANK FIRST ORDER BY a.OWNER ASC, a.PACKAGE_NAME ASC, a.SUBPROGRAM_ID ASC, a.SEQUENCE ASC) next_sibling,
MIN(a.DATA_LEVEL) KEEP (DENSE_RANK FIRST ORDER BY a.OWNER ASC, a.PACKAGE_NAME ASC, a.SUBPROGRAM_ID ASC, a.SEQUENCE ASC) DATA_LEVEL
FROM (
SELECT
lead(a.SEQUENCE, 1, a.SEQUENCE) OVER (
PARTITION BY a.OWNER, a.PACKAGE_NAME, a.SUBPROGRAM_ID, a.DATA_LEVEL
ORDER BY a.SEQUENCE ASC
) next_sibling,
a.TYPE_OWNER, a.TYPE_NAME, a.TYPE_SUBNAME, a.OWNER, a.PACKAGE_NAME,
a.SUBPROGRAM_ID, a.SEQUENCE, a.DATA_LEVEL, a.DATA_TYPE
FROM SYS.ALL_ARGUMENTS a
WHERE a.OWNER IN ('MY_SCHEMA') -- Possibly replace schema here
) a
WHERE (a.TYPE_OWNER IN ('MY_SCHEMA') -- Possibly replace schema here
AND a.OWNER IN ('MY_SCHEMA') -- Possibly replace schema here
AND a.DATA_TYPE = 'PL/SQL RECORD')
GROUP BY a.TYPE_OWNER, a.TYPE_NAME, a.TYPE_SUBNAME
) x
ON ((a.OWNER, a.PACKAGE_NAME, a.SUBPROGRAM_ID) = ((x.OWNER, x.PACKAGE_NAME, x.SUBPROGRAM_ID))
AND a.SEQUENCE BETWEEN x.SEQUENCE AND next_sibling
AND a.DATA_LEVEL = (x.DATA_LEVEL + 1))
ORDER BY x.TYPE_OWNER ASC, x.TYPE_NAME ASC, x.TYPE_SUBNAME ASC, a.SEQUENCE ASC
और देखें इस ब्लॉग पोस्ट में इस तकनीक के बारे में विवरण (जिससे प्रश्न लिया गया था) ।