1 Reply Latest reply: Apr 25, 2013 12:48 AM by Marwim RSS

    plsql concurrentcurrency

    1005365
      I have a procedure like under the below and ı want to compile and run it in my database for getting concurrent currency but i do not know how can i modified it or am i have to modified this code for working.

      PROCEDURE Set_Daily_Currencies IS
      gelen_data_ UTL_HTTP.html_pieces;
      alinan_sayfa_ NUMBER;
      gelen_data_textclob_ CLOB;
      --xml parse ile ilgili degiskenler
      l_parser DBMS_XMLPARSER.parser;
      l_doc DBMS_XMLDOM.domdocument;
      l_nl DBMS_XMLDOM.domnodelist;
      l_n DBMS_XMLDOM.domnode;
      l_temp VARCHAR2 (1000);

      TYPE tab_type IS TABLE OF par_currency_rates%ROWTYPE;

      t_tab tab_type := tab_type ();
      l_nodemap DBMS_XMLDOM.domnamednodemap;
      l_attr_node DBMS_XMLDOM.domnode;
      --xml parse ile ilgili degiskenler
      valid_date_ DATE;
      para_birimi_ VARCHAR2 (50);
      para_birimi_alis_ VARCHAR2 (100);
      para_birimi_satis_ VARCHAR2 (100);
      para_birimi_ortalama_deger_ NUMBER;
      ortalama_usd_deger_ NUMBER;
      ortalama_euro_deger_ NUMBER;
      ortalama_gbp_deger_ NUMBER;
      BEGIN
      --http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
      --http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
      gelen_data_ :=
      UTL_HTTP.request_pieces ('http://www.tcmb.gov.tr/kurlar/today.xml',
      100);

      --dbms_output.put_line(gelen_data_.count || ' pieces were retrieved.');
      --dbms_output.put_line('with total length ');
      IF gelen_data_.COUNT < 1
      THEN
      DBMS_OUTPUT.put_line ('0');
      ELSE
      DBMS_OUTPUT.put_line ( (2000 * (gelen_data_.COUNT - 1))
      + LENGTH (gelen_data_ (gelen_data_.COUNT))
      );
      END IF;

      --dbms_output.put_line(gelen_data_(1));
      alinan_sayfa_ := 1;
      gelen_data_textclob_ := NULL;

      IF gelen_data_.COUNT > 0
      THEN
      LOOP
      gelen_data_textclob_ :=
      gelen_data_textclob_ || gelen_data_ (alinan_sayfa_);
      alinan_sayfa_ := alinan_sayfa_ + 1;

      --dbms_output.put_line('sayfa : '||alinan_sayfa_);
      IF alinan_sayfa_ = gelen_data_.COUNT + 1
      THEN
      EXIT;
      END IF;
      END LOOP;
      END IF;

      --dbms_output.put_line(gelen_data_textClob_);
      --http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
      --http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor


      --Merkez bankasi XML inden doviz kurlarinin gecerlilik tarihi aliniyor..(valid_date_)
      --Merkez bankasi XML inden doviz kurlarinin gecerlilik tarihi aliniyor..
      -- Create a parser.
      l_parser := DBMS_XMLPARSER.newparser;
      -- Parse the document and create a new DOM document.
      DBMS_XMLPARSER.parseclob (l_parser, gelen_data_textclob_);
      l_doc := DBMS_XMLPARSER.getdocument (l_parser);
      -- Free resources associated with the CLOB and Parser now they are no longer needed.
      DBMS_LOB.freetemporary (gelen_data_textclob_);
      DBMS_XMLPARSER.freeparser (l_parser);
      -- Get a list of all the Tarih_Date nodes in the document using the XPATH syntax.
      l_nl :=
      DBMS_XSLPROCESSOR.selectnodes (DBMS_XMLDOM.makenode (l_doc),
      '/Tarih_Date'
      );
      DBMS_OUTPUT.put_line (DBMS_XMLDOM.getlength (l_nl));
      l_n := DBMS_XMLDOM.item (l_nl, 0);
      --dbms_xslprocessor.valueOf(l_n,'Tarih/text()',gecici,null);
      l_nodemap := DBMS_XMLDOM.getattributes (l_n);
      l_attr_node := DBMS_XMLDOM.getnameditem (l_nodemap, 'Tarih');
      valid_date_ :=
      TO_DATE (DBMS_XMLDOM.getnodevalue (l_attr_node), 'DD.MM.YYYY');
      DBMS_OUTPUT.put_line (valid_date_);
      --Merkez bankasi XML inden doviz kurlarinin gecerlilik tarihi aliniyor..
      --Merkez bankasi XML inden doviz kurlarinin gecerlilik tarihi aliniyor..


      --Merkez bankasindan sadece usd,eur ve sterlin degerlerini aliyorum...
      --Merkez bankasindan sadece usd,eur ve sterlin degerlerini aliyorum...
      -- Get a list of all the Tarih_Date nodes in the document using the XPATH syntax.
      l_nl :=
      DBMS_XSLPROCESSOR.selectnodes (DBMS_XMLDOM.makenode (l_doc),
      '/Tarih_Date/Currency'
      );
      DBMS_OUTPUT.put_line (DBMS_XMLDOM.getlength (l_nl));

      -- Loop through the list and create a new record in a tble collection
      -- for each EMP record.
      FOR cur_dvz IN 0 .. DBMS_XMLDOM.getlength (l_nl) - 1
      LOOP
      l_n := DBMS_XMLDOM.item (l_nl, cur_dvz);
      DBMS_XSLPROCESSOR.valueof (l_n, 'CurrencyName/text()', para_birimi_);

      dbms_output.put_line('para_birimi : '||para_birimi_); tum para birimleri yaziyor
      IF para_birimi_ IN ('US DOLLAR', 'EURO', 'POUND STERLING')
      THEN
      -- Use XPATH syntax to assign values to he elements of the collection.
      -- 1 (TL) 2 (GBP) 3 (EURO) 4 (USD)
      IF para_birimi_ = 'US DOLLAR'
      THEN
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '4';
      t_tab (t_tab.LAST).currency_to := '1';
      END IF;

      IF para_birimi_ = 'EURO'
      THEN
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '3';
      t_tab (t_tab.LAST).currency_to := '1';
      END IF;

      IF para_birimi_ = 'POUND STERLING'
      THEN
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '2';
      t_tab (t_tab.LAST).currency_to := '1';
      END IF;

      DBMS_XSLPROCESSOR.valueof (l_n,
      'ForexBuying/text()',
      para_birimi_alis_
      );
      DBMS_XSLPROCESSOR.valueof (l_n,
      'ForexSelling/text()',
      para_birimi_satis_
      );
      para_birimi_ortalama_deger_ :=
      ( TO_NUMBER (para_birimi_alis_, '999999999.9999')
      + TO_NUMBER (para_birimi_satis_, '999999999.9999')
      )
      / 2;
      t_tab (t_tab.LAST).VALUE := para_birimi_ortalama_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;

      --BU DEGISKENLER CAPRAZ KURLAR ICIN KULLANILACAK
      --HER DEGER TL KARSILIGINI IFADE EDIYOR
      IF para_birimi_ = 'US DOLLAR'
      THEN
      ortalama_usd_deger_ := para_birimi_ortalama_deger_;
      END IF;

      IF para_birimi_ = 'EURO'
      THEN
      ortalama_euro_deger_ := para_birimi_ortalama_deger_;
      END IF;

      IF para_birimi_ = 'POUND STERLING'
      THEN
      ortalama_gbp_deger_ := para_birimi_ortalama_deger_;
      END IF;
      --BU DEGISKENLER CAPRAZ KURLAR ICIN KULLANILACAK
      --HER DEGER TL KARSILIGINI IFADE EDIYOR
      END IF;
      END LOOP;

      --Merkez bankasindan sadece usd,eur ve sterlin degerlerini aliyorum...
      --Merkez bankasindan sadece usd,eur ve sterlin degerlerini aliyorum...


      --Capraz kurlar gecici t_tab dizi tablosuna ekleniyor
      --Capraz kurlar gecici t_tab dizi tablosuna ekleniyor
      -- 1 (TL) 2 (GBP) 3 (EURO) 4 (USD)
      --TL to GBP
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '1';
      t_tab (t_tab.LAST).currency_to := '2';
      t_tab (t_tab.LAST).VALUE := 1 / ortalama_gbp_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --TL to GBP
      --TL to EUR
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '1';
      t_tab (t_tab.LAST).currency_to := '3';
      t_tab (t_tab.LAST).VALUE := 1 / ortalama_euro_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --TL to EUR
      --TL to USD
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '1';
      t_tab (t_tab.LAST).currency_to := '4';
      t_tab (t_tab.LAST).VALUE := 1 / ortalama_usd_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --TL to USD
      -- 1 (TL) 2 (GBP) 3 (EURO) 4 (USD)
      --GBP to EURO
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '2';
      t_tab (t_tab.LAST).currency_to := '3';
      t_tab (t_tab.LAST).VALUE := ortalama_gbp_deger_ / ortalama_euro_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --GBP to EURO
      --GBP to USD
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '2';
      t_tab (t_tab.LAST).currency_to := '4';
      t_tab (t_tab.LAST).VALUE := ortalama_gbp_deger_ / ortalama_usd_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --GBP to USD
      -- 1 (TL) 2 (GBP) 3 (EURO) 4 (USD)
      --EURO to GBP
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '3';
      t_tab (t_tab.LAST).currency_to := '2';
      t_tab (t_tab.LAST).VALUE := ortalama_euro_deger_ / ortalama_gbp_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --EURO to GBP
      --EURO to USD
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '3';
      t_tab (t_tab.LAST).currency_to := '4';
      t_tab (t_tab.LAST).VALUE := ortalama_euro_deger_ / ortalama_usd_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --EURO to USD
      -- 1 (TL) 2 (GBP) 3 (EURO) 4 (USD)
      --USD to GBP
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '4';
      t_tab (t_tab.LAST).currency_to := '2';
      t_tab (t_tab.LAST).VALUE := ortalama_usd_deger_ / ortalama_gbp_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;
      --USD to GBP
      --USD to EURO
      t_tab.EXTEND;
      t_tab (t_tab.LAST).currency_from := '4';
      t_tab (t_tab.LAST).currency_to := '3';
      t_tab (t_tab.LAST).VALUE := ortalama_usd_deger_ / ortalama_euro_deger_;
      t_tab (t_tab.LAST).valid_date := valid_date_;

      --USD to EURO
      --Capraz kurlar gecici t_tab dizi tablosuna ekleniyor
      --Capraz kurlar gecici t_tab dizi tablosuna ekleniyor


      --Hazirlanan DATA , PAR_CURRENCY_RATES tablosuna insert ediliyor
      --Hazirlanan DATA , PAR_CURRENCY_RATES tablosuna insert ediliyor
      --Eger valid date i ayni gun olan kayit varsa temizleniyor...
      DELETE FROM par_currency_rates
      WHERE valid_date = valid_date_;
      --Eger valid date i ayni gun olan kayit varsa temizleniyor...
      --Guncel data insert inden Insert ten once eski valid kayitlar invalid ediliyor.
      UPDATE par_currency_rates set is_valid = 0 where is_valid = 1;

      FOR cur_row IN t_tab.FIRST .. t_tab.LAST
      LOOP
      INSERT INTO par_currency_rates
      (currency_from,
      currency_to, VALUE,
      valid_date,
      is_valid
      )
      VALUES (t_tab (cur_row).currency_from,
      t_tab (cur_row).currency_to, t_tab (cur_row).VALUE,
      t_tab (cur_row).valid_date,
      1
      );
      END LOOP;
      --Hazirlanan DATA , PAR_CURRENCY_RATES tablosuna insert ediliyor
      --Hazirlanan DATA , PAR_CURRENCY_RATES tablosuna insert ediliyor
      COMMIT;
      EXCEPTION
      WHEN OTHERS
      THEN
      --err_num := SQLCODE;
      --err_msg := SUBSTR(SQLERRM, 1, 100);
      DBMS_OUTPUT.put_line ( 'Error Number: '
      || SQLCODE
      || 'Error Message:'
      || SUBSTR (SQLERRM, 1, 100)
      );
      DBMS_LOB.freetemporary (gelen_data_textclob_);
      DBMS_XMLPARSER.freeparser (l_parser);
      DBMS_XMLDOM.freedocument (l_doc);
      ROLLBACK;
      END Set_Daily_Currencies;

      Edited by: 1002362 on 24.Nis.2013 22:54
        • 1. Re: plsql concurrentcurrency
          Marwim
          Hello,

          welcome to the forum.

          This is the forum for the tool {forum:id=260}.
          Please mark this question as answered (so others know that they can ignore it) and post again in {forum:id=75}.

          Before posting you might want to read {message:id=9360002} especially about how to format your code and about necessary informations like db version.

          Regards
          Marcus

          Edited by: Marwim on 25.04.2013 07:47