Announcement

Collapse
No announcement yet.

Cursor......

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Cursor......

    Hallo an alle!

    Habe folgendes problem:
    Ich möchte einen eintrag in eine tabelle schreiben (siehe cursor Tabeintrag...) Bei diesem Eintrag kommt aber auch die Variable-- lsql_ergebnis -- vor, die bei jedem durchlauf sich ändert --> natürlich möchte ich in die Tabelle auch immer den aktuellen wert schreiben --> darum kann ich die abfrage nicht unter dem pl/sql block machen.......meine frage: wie kann ich den cursor abändern, damit er bei jedem durchlauf die aktuelle variable und alle anderen werte in die tabelle schreibt????? oder kann ich in diesem fall gar keinen cursor verwenden? wie soll ich es dann machen? danke im vorraus für eure antworten.... mfg Marc

    nun der script:

    column dcol new_value mydate noprint
    select to_char(sysdate,'YYYYMMDDhhmi') dcol from dual;
    spool D:\AMIS\SQL\Marc\zz_LW_O_Egebnisse/&mydate._AMIS_VDK_anmelden.txt

    set feedback off
    set tab off
    SET LINESIZE 100
    set pagesize 0
    set colsep ';'
    set heading off
    set verify off
    set serveroutput on

    variable sd_id number
    variable am_id number
    variable plsql_ergebnis number
    variable td_taddr number

    declare

    CURSOR GruppeZaehler IS /*Zähler aus gruppe suchen*/
    select store_device_id resStr1, dgsdl.store_device_id
    from dev_grp_store_device_lnk dgsdl where device_group_id in
    (select id from device_group where name like '&2');

    Zeile_gz GruppeZaehler%RowType;
    zaehler_id dev_grp_store_device_lnk.store_device_id%Type;

    CURSOR SummeDatenkanal IS /*Datenkanal suchen anhand von Zähler-id(sd.id)*/
    select measured_type resStr2, measured_type
    from datachannel where store_device_id = :sd_id and type like 'PPRF';

    Zeile_sd SummeDatenkanal%RowType;
    oldTar datachannel.measured_type%Type;

    a number := 0;
    b number := 0;
    c number := 0;
    d number := 0;
    ergebnis number;

    CURSOR Ausgabe IS /*Ausgabe der kompletten Zeile - abhängig von Zähler ID*/
    select to_char(sysdate,'MMDDhhmiss') ||';'|| td.target_address ||';'||lsql_ergebnis
    ||';'||substr(to_char(:am_id),8,2) abfrage from trans_device td where
    id in (select trans_device_id from store_device where
    id in (select store_device_id from dev_grp_store_device_lnk
    where device_group_id in (select id from device_group where name like '&2')
    and store_device_id = :sd_id));

    Zeile_Ausgabe Ausgabe%RowType;

    CURSOR Tabeintrag IS /*Eintrag der angemeldeten Zähler in die Tab ZEAG_AMIS_VDK_angemeldet*/
    INSERT INTO ZEAG_AMIS_VDK_angemeldet (sd_id, name, equi, summe, bcast, datum)
    SELECT sd.id, sd.description, :td_taddr, lsql_ergebnis, substr(to_char(:am_id),8,2), to_char(sysdate,'YYMMDDhh')
    FROM store_device sd
    where sd.id IN(select dgsdl.store_device_id from dev_grp_store_device_lnk dgsdl
    where dgsdl.device_group_id IN(select dg.id from device_group dg
    where name like '&2'));

    begin

    dbms_output.enable(102400);
    open GruppeZaehler;

    loop
    fetch GruppeZaehler into Zeile_gz;
    exit when GruppeZaehler%NOTFOUND;
    if (zaehler_id IS NULL) OR (zaehler_id <> Zeile_gz.store_device_id) then

    zaehler_id := Zeile_gz.store_device_id;

    select id into :sd_id from store_device where id = zaehler_id;

    select target_address into :td_taddr from trans_device td where
    id in (select trans_device_id from store_device where
    id in (select store_device_id from dev_grp_store_device_lnk
    where device_group_id in (select id from device_group where name like '&2')
    and store_device_id = :sd_id));

    open SummeDatenkanal;

    loop

    fetch SummeDatenkanal into Zeile_sd;
    exit when SummeDatenkanal%NOTFOUND;

    oldTar := Zeile_sd.measured_type;
    if (oldTar = 1) then
    a := 1;
    else if (oldTar = 2) then
    b := 2;
    else if (oldTar = 3) then
    c := 4;
    else if (oldTar = 4) then
    d := 8;

    end if;
    end if;
    end if;
    end if;

    end loop;

    ergebnis := a+b+c+d;

    select id into :am_id from action_mode where name = '&1';
    /*hier könnte man eventuell noch nach Übergabeparameter &2 ergänzen, damit man zwischen täglich und monatlicher Auslesung unterscheiden kann*/
    lsql_ergebnis := ergebnis;

    open Ausgabe;

    fetch Ausgabe into Zeile_Ausgabe;
    exit when Ausgabe%NOTFOUND;

    dbms_output.put_Line(Zeile_Ausgabe.abfrage);

    close Ausgabe;

    a := 0;
    b := 0;
    c := 0;
    d := 0;

    close SummeDatenkanal;

    open Tabeintrag;
    close Tabeintrag;

    end if;
    end loop;
    close GruppeZaehler;

    end;
    /

    delete from dev_grp_store_device_lnk where device_group_id IN(select id from device_group where name like '&2');

    spool off
    exit

  • #2
    nachdem man den script hier nicht gut lesen kann......folgt auch noch der anhan

    Comment


    • #3
      Hallo ofna,

      das kannst an explizite Cursor doch einfach eine Variable übergeben:

      cursor cTest(pParam1 pls_integer) is
      select * from tab1 where tab1.param = pParam1;

      Aufrufen tust du das ganze dann so:
      open cTest(hier_der_aktuelle_Wert);

      Gruß Falk

      P.S.: wer soll denn solche langen Scripte lesen ;
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        danke für die antwort frank....
        aber ich bin mir nicht ganz sicher ob ichs richtig verstanden hab...?

        cursor cTest(pParam1 pls_integer) is
        select * from tab1 where tab1.param = pParam1;

        also in meinem fall:

        cursor Tabeintrag(lsql_ergebnis pls_integer) is
        select sd.id, sd.description, :td_taddr, lsql_ergebnis, substr(to_char(:am_id),8,2), to_char(sysdate,'YYMMDDhh') FROM store_device sd where sd.param = lsql_ergebnis;

        und dann:

        open cTest(hier_der_aktuelle_Wert);

        open Tabeintrag(lsql_ergebnis);
        und wie schreib ich den eintrag dann in die tabelle??
        hier??

        INSERT INTO ZEAG_AMIS_VDK_angemeldet (sd_id, name, equi, summe, bcast, datum)
        SELECT sd.id, sd.description, :td_taddr, lsql_ergebnis, substr(to_char(:am_id),8,2), to_char(sysdate,'YYMMDDhh')
        FROM store_device sd
        where sd.id IN(select dgsdl.store_device_id from dev_grp_store_device_lnk dgsdl
        where dgsdl.device_group_id IN(select dg.id from device_group dg
        where name like '&2'));

        close Tabeintrag

        Comment


        • #5
          wenn ich es so mache wie oben beschrieben, dann bekomme ich bei jedem durchlauf alle werte......
          was muss ich denn noch ändern, damit ich nur immer 1Zeile in die tabelle eintrage?

          Comment


          • #6
            Hallo,

            <cite>also in meinem fall:
            cursor Tabeintrag(lsql_ergebnis pls_integer) is
            select sd.id, sd.description, :td_taddr, lsql_ergebnis, substr(to_char(:am_id),8,2), to_char(sysdate,'YYMMDDhh') FROM store_device sd where sd.param = lsql_ergebnis; </cite>
            <br>
            Besser:
            cursor Tabeintrag(pplsql_ergebnis pls_integer, pam_id pls_integer) is
            select sd.id, sd.description, :td_taddr, pplsql_ergebnis, substr(to_char(pam_id),8,2), to_char(sysdate,'YYMMDDhh') FROM store_device sd where sd.param = pplsql_ergebnis;

            <cite>und dann:
            open Tabeintrag(lsql_ergebnis); </cite>
            <br>
            Jetzt:
            open Tabeintrag(lsql_ergebnis, :am_id); </cite>

            Gruß <b>Falk</b&gt
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              dankeschön.....

              Comment

              Working...
              X