मैं इसे सी # .NET से कॉल करने वाली संग्रहीत प्रक्रिया के माध्यम से एकाधिक पंक्तियां डालना चाहता हूं। मैं Oracle द्वारा .NET के लिए प्रदान किए गए OracleDataAccess.dll अप्रबंधित .net ड्राइवर का उपयोग कर रहा हूं और VS 2015 का उपयोग कर रहा हूं। मेरा प्रोग्राम एक कंसोल प्रोग्राम है जो एक्सेल में एक विशिष्ट वर्कशीट को देखकर एक्सेल फाइलों (एक-एक करके) को पढ़ेगा और डेटा सम्मिलित करेगा। ओरेकल में एक टेबल में वर्कशीट।

मैंने शोध किया है और पाया है कि लोग कहते हैं कि यह एक्सएमएल, यूडीटी और ओरेकलबुल्ककॉपी के माध्यम से किया जा सकता है लेकिन मुझे जो कोड मिला है वह काम नहीं करता है। मैंने इसे कोड की एक एक्सएमएल लाइन के रूप में चलाकर इसका परीक्षण करने का प्रयास किया। इस त्रुटि का स्क्रीन डंप बहुत अंत में प्रदान किया गया है।

मैं Oracle तालिका में इन अभिलेखों को सम्मिलित करने के परिणाम को प्राप्त करने के लिए इसे C# से Oracle तक कैसे पारित किया जाए, इस पर एक समाधान की तलाश कर रहा हूं। यदि आप मुझे Oracle और C#.NET पर यह पता लगाने में मदद कर सकते हैं तो मैं आभारी रहूंगा।

सी#.नेट साइड कोड नीचे:

public class DSelect
{
  public string Installation { get; set; }
  public int Account { get; set; }
  public int BusinessNumber { get; set; }
  public long Sysd { get; set; }        
  public decimal LocX { get; set; }        
  public string Type { get; set; }
  public string Wattage { get; set; }
  public decimal ALen { get; set; }
  public int LWatt { get; set; }
  public string Tempr { get; set; }
  public DateTime CreatedDate { get; set; }       
}

List<DSelect> listDSelect = new List<DSelect>();

.... Reading an excel worksheet row in a loop and building my list. There can be between 500 to 1000 rows of data in the worksheet

var deSel= new DSelect();
deSel.Installation  = "install1";
.................................
listDSelect.Add(deSel)

XmlSerializer serializer = new XmlSerializer(typeof(List<DSelect>));

var stringwriter = new System.IO.StringWriter();

serializer.Serialize(stringwriter, listDSelect);

Oracle डेटाबेस 12c में तालिका में सम्मिलित करने के लिए संग्रहीत कार्यविधि में पास करें।

  1. मैं पूरी सूची को ऑब्जेक्ट के रूप में ऑरैकल संग्रहीत प्रक्रिया में पास करना चाहता हूं।
  2. ऑरैकल संग्रहीत प्रक्रिया में इसे प्राप्त करें और इसे एक तालिका में डालें।

परीक्षण कोड जो SQL डेवलपर में विफल रहता है:

DECLARE
  p_AdditionRequest varchar2(30000); -- CLOB;
  t_xmlType SYS.XMLTYPE;
BEGIN    
  p_AdditionRequest:= '<?xml version="1.0" encoding="utf-16"?>
<ArrayOfDetailedSelection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DetailedSelection>
    <Installation>645805</InstallationNumber>
    <AccountNumber>33170019251</AccountNumber>
  </DetailedSelection>
</ArrayOfDetailedSelection>';
  --t_xmlType := sys.xmltype.createxml(p_AdditionRequest); 

  SELECT InstallationNumber, AccountNumber (
  SELECT ExtractValue(column_value, '/DetailedSelection/InstallationNumber') InstallationNumber,
         ExtractValue(column_value, '/DetailedSelection/AccountNumber') AccountNumber         
  FROM TABLE(XMLSequence(XMLTYPE(p_AdditionRequest).EXTRACT('/ArrayOfDetailedSelection/DetailedSelection')))
       )
END;
/
0
Ruruboy 16 पद 2019, 12:01

1 उत्तर

सबसे बढ़िया उत्तर

आपका SQL कोड करीब है, लेकिन आपको कुछ त्रुटियां हैं। सबसे पहले, आप स्थापना और स्थापना संख्या के बीच असंगत हैं और दूसरी बात यह है कि आप एक INTO खो रहे हैं। मैंने डेटा रखने के लिए एक परीक्षण तालिका बनाई है, लेकिन ऐसा कुछ काम करना चाहिए:

DECLARE
  p_AdditionRequest varchar2(30000); -- CLOB;
BEGIN    
  p_AdditionRequest:= '<?xml version="1.0" encoding="utf-16"?>
<ArrayOfDetailedSelection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DetailedSelection>
    <InstallationNumber>645805</InstallationNumber>
    <AccountNumber>33170019251</AccountNumber>
  </DetailedSelection>
</ArrayOfDetailedSelection>';

INSERT INTO TESTDETAILEDSECTION
  SELECT InstallationNumber, AccountNumber
  FROM (
  SELECT ExtractValue(column_value, '/DetailedSelection/InstallationNumber') InstallationNumber,
         ExtractValue(column_value, '/DetailedSelection/AccountNumber') AccountNumber         
  FROM TABLE(XMLSequence(XMLTYPE(p_AdditionRequest).EXTRACT('/ArrayOfDetailedSelection/DetailedSelection')))
       );
END;
/

हालांकि मैं चयन के लिए थोड़ा अलग वाक्यविन्यास का उपयोग करना पसंद करता हूं, इस प्रकार:

INSERT INTO TESTDETAILEDSECTION
  SELECT xt.INSTALLATION, xt.ACCOUNTNUMBER FROM 
XMLTABLE('/ArrayOfDetailedSelection/DetailedSelection' PASSING xmlType(p_AdditionRequest)
  COLUMNS 
  "INSTALLATION" varchar(20) PATH 'InstallationNumber',
  "ACCOUNTNUMBER" varchar(20) PATH 'AccountNumber') xt;

इस उत्तरार्द्ध का लाभ यह है कि पार्स करते समय आप एक्सएमएल में फ़ील्ड के डेटाटाइप को सेट कर सकते हैं। (मैंने मान लिया था कि इंस्टालेशन नंबर और अकाउंट नंबर दोनों वर्चर्स थे)। तुम्हारा शक भी सही है; सी # से गुजरते समय आपको clob का उपयोग करना होगा। यहां एक छोटी सी युक्ति, सी# से आपको अपने पैरामीटर के लिए OracleDbType और OracleDbTypeEx दोनों को OracleDbTyp.Clob पर सेट करना होगा।

1
Jonathan Willcock 16 पद 2019, 10:15