Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पीएल/एसक्यूएल रिकॉर्ड के साथ ओरेकल प्रक्रिया को कॉल करना स्प्रिंग जेडीबीसी से टाइप करें

दुर्भाग्य से, 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

और देखें इस ब्लॉग पोस्ट में इस तकनीक के बारे में विवरण (जिससे प्रश्न लिया गया था)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक्स इनपुट पैरामीटर के साथ पीएल/एसक्यूएल प्रक्रिया कैसे लिखें और एक्स पैरामीटर के इनपुट/आउटपुट को संयुक्त करें

  2. Oracle में दिए गए स्ट्रिंग से विशिष्ट तार निकालने के लिए

  3. सरोगेट कुंजियों पर रिवर्स इंडेक्स का उपयोग करने का अच्छा अभ्यास? (आकाशवाणी)

  4. SQL त्रुटि:ORA-00942 तालिका या दृश्य मौजूद नहीं है

  5. प्रक्रिया में डीएमएल के बाद प्रतिबद्धता रखने का क्या प्रभाव है?