Select in PL/SQL block

  • #1
O

ofna

Mitglied
Themenersteller
Dabei seit
17.11.2005
Beiträge
6
Reaktionspunkte
0
hallo an alle!

ich habe folgendes problem - vielleicht kann mir wer helfen..........

ich möchte eine ganz normale SELECT abfrage ohne INTO in einem PL/SQL block machen --> bekomme aber immer den fehler expected an into in this select....... - was ich aber nicht will!!

jetzt hab ich im internet gesucht und ich glaube dass das irgendwie mit Transaktionssteuerungen(ROLLBACK, COMMIT usw...)  oder mit CURSOR zusammenhängt aber ich habe keine weitere hilfen gefunden - nur begriffserklärungen.......und nachdem ich mit cursor oder Transaktionssteuerungen noch nie gearbeitet habe wäre es ein hitt, wenn ihr mir ein beispiel als antwort schicken könntet......

BSPL:
Code:
declare
 
input char(255);
 
begin
select id into input from action_mode where name =->&1';
 
DBMS_OUTPUT.PUT_LINE(input);
 
?????????? SELECT............FROM............WHERE............; ???????????????? (ohne INTO!!!)

end;
/


mfg ofna
 
  • #2
Hallo Ofna,
nein, ich glaube nicht, dass das etwas mit Transaktionssteuerung oder Cursorn zu tun hat. Die Frage, die ich mir stelle, und die sich wahrscheinlich auch die Entwickler von PL/SQL gestellt haben, ist: Warum ein SELECT, wenn das Ergebnis nicht verwertet wird. Weder wird es in irgend einer Form für den Benutzer sichtbar noch steht es irgendwie für eine weitere Verarbeitung zur Verfügung. Das Statement wäre nutzloser Code. Aber beschreib doch vielleicht mal, was Du mit diesem SELECT eigentlich erreichen willst. Etwas anderes wäre es, wenn es sich um eine Subquery handelt, wie bei Deinem früheren Posting. Aber dann würde ich erwarten, dass PL/SQL es auch zulässt.
Viele Grüße - Ulrich
 
  • #3
ich habe folgende aufgabe bekommen:
1) ich soll mich mit einem cmd file bei der datenbank anmelden........in diesem cmd file soll ich zwei parameter mitschicken (xxx = &1 und yyy = &2)

2) dann soll ich in SQL*Plus mit dem wir firmenmäßig arbeiten, diese beiden parameter einlesen und in meiner select abfrage verwenden - diese select abfrage lasse ich mit spool aufzeichnen und in eine .txt datei speichern --> und diese txt datei wird später in ein anderes verzeichnis umgelegt werden sodass ein weiteres programm diese ausgabe was ich bekomme, verwenden kann........(für dieses programm ist diese ausgabe nämlich der befehlscode) --> und aus diesem grund möchte ich eine schlichte select abfrage machen --> ohne dass ich diese weiterverwenden möchte!!!

3)Aber heute habe ich ein neues problem bekommen!!! --> ich bräuchte eine Lösung, dass ich bei dieser select abfrage nach jeder zeile stoppe und kontrolliere ob ein wert = dem wert der nächsten zeile ist --> und je nach dem sollte ich die zeile entweder ausgeben oder nicht ausgeben --> wenn ja, dann den neuen wert speichern und wieder mit der nächsten zeile vergleichen - usw.......
ABER WIE????
-------------------------------------------------------------------

Bis jetzt:
mit spool zeichne ich die abfrage auf(==ERGEBNIS!!!)

dann funktioniert meine abfage so, dass ich mit (variable d char) eine variable erstelle und in diese dann mit der ersten abfrage (select id into :d ...........)
einen wert speichere, den ich in der nächsten Abfrage benötige (lange select abfrage)

MEINE PROBLEME: ich kann die lange select abfrage nicht im pl/sql block verwenden, weil dann müsste ich INTO verwenden und das bringe ich irgendwie nicht so hin, dass funtioniert!!! und wenn ich mit declare (variablenefinition) arbeite, kann ich meine variablen nur im PL/SQL block verwenden - nicht aber für meine abfrage die ausserhalb des blocks steht!!!!
und  wie kann ich nach jeder zeile stoppen und werte kontrollieren und anhand vom ergebnis eben dan die weiteren schritte machen???

also wie kann ich entweder meine lange select abfrage im PL/SQL block verwenden oder wie kann ich die variablen die ich mit declare deklariert habe außerhalb vom block verwenden??? und wie mache ich das mit der überprüfung von einzelnen zeilen???

mein bisheriger code.....

Code:
column dcol new_value mydate noprint
select to_char(sysdate,'YYYYMMDDhhmi') dcol from dual;
spool D:\AMIS\SQL\Marc\LW_O_Ergebnisse\NEUE/&mydate._AMISTest_LP_Broadcast.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 d char(255);

begin

select id into :d from action_mode where name =->&1';

end;
/

select to_char(sysdate,'MMDDhhmiss') ||';'||';'|| td.target_address ||';'|| sd.address ||';'||'2;'||to_char(sysdate-1,'YYYYMMDD')||'0000'||';'||to_char(sysdate,'YYYYMMDD')||'0015'||';' from store_device sd, trans_device td where td.id=sd.trans_device_id and sd.id IN (select ag.store_device_id from action_group ag, action_mode_lnk aml where ag.id = aml.action_group_id and aml.action_mode_id= :d and ag.name like->&2.%');

spool off
exit


und so sieht das ergebnis bis jetzt aus.......
Code:
1122040628;;00000000;1000708;2;200511210000;200511220015;                                           
1122040628;;12345678;1000723;2;200511210000;200511220015;                                           
1122040628;;12345670;0000000;2;200511210000;200511220015;                                           
1122040628;;12345670;1000783;2;200511210000;200511220015;                                           
1122040628;;99999999;1000900;2;200511210000;200511220015;

und ich müsste bei dieser ausgabe zum beispiel verhindern, dass die 3. und 4. zeile ausgegeben werden (weil der zweite eintrag 12345670 bei beiden gleich ist)
--> statt dessen dürfte nur die 3. zeile ausgegeben werden, NICHT aber die 4.

Danke für alle beispiele und tipps - ich bin über jeden post sehr froh  :)
danke im vorraus!!!!

mfg ofna
 
  • #4
Hallo Ofna,
dann soll ich in SQL*Plus
das sieht ja schon ganz anders aus: In Sqlplus sollte es kein Problem sein, ein select ohne into zu verwenden und das Ergebnis steht ja in der Ausgabedatei zur Verfügung. Wenn ich es richtig sehe, ist das in Deinem Beispiel zwischen begin und end PL/SQL-Code und die zweite lange Abfrage einfaches SQL; dabei solltest Du kein into brauchen.
und wie kann ich nach jeder zeile stoppen und werte kontrollieren
Jetzt wird die Sache mit den Cursorn aktuell: Damit kannst Du in PL/SQL eine Tabelle Zeile für Zeile lesen und verarbeiten. Die Syntax habe ich jetzt nicht im Kopf, aber ich kann sie morgen an meinem Arbeitsplatz heraussuchen.
Leider habe ich nicht so ganz parat, wie man mit Variablen in Sqlplus umgeht (verwende bei meiner Arbeit embedded SQL in C-Programmen). Eine Möglichkeit, das Problem zu umgehen, wäre, das Ergebnis in eine temporäre Tabelle zu speichern und diese dann außerhalb des PL/SQL-Blocks auszulesen, so dass das Spooling wirksam wird.
ich müsste bei dieser ausgabe zum beispiel verhindern, dass die 3. und 4. zeile ausgegeben werden (weil der zweite eintrag 12345670 bei beiden gleich ist)
Wäre es vielleicht eine Alternative, das einfach bei der späteren Auswertung der Spool-Ausgabe zu erledigen?
Viele Grüße - Ulrich
 
  • #5
Hallo Ofna,
das Lesen mit Cursor in einer for-Schleife geht folgendermassen:
Zunaechst unter declare je eine Variable fuer den Datensatz und den Cursor definieren:
Code:
v_store_device store_device%rowtype;
cursor c_store_device is select * from store_device where ...;
Dann im Anweisungsblock den Cursor auslesen:
Code:
for v_store_device in c_store_device loop
...
der Inhalt der Tabellenzeile steht jetzt in v_store_device und kann verarbeitet werden
...
end loop;
 
Thema:

Select in PL/SQL block

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben