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
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
Comment