Select in PL/SQL block

Dieses Thema Select in PL/SQL block im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von ofna, 22. Nov. 2005.

Thema: Select in PL/SQL block hallo an alle! ich habe folgendes problem - vielleicht kann mir wer helfen.......... ich möchte eine ganz...

  1. 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,
    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.
    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.
    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;
    
     
Die Seite wird geladen...

Select in PL/SQL block - Ähnliche Themen

Forum Datum
neue Auswahl (Select) nach Auswahl erzeugen Windows XP Forum 24. Jan. 2011
Dienste - Event-Prot.eintrag eliminieren: Acronis OS Selector Reinstall Service Windows Vista Forum 4. Nov. 2009
Win7- 64bit, ITE Wireless Selector Windows 7 Forum 29. Aug. 2009
Problem: Reboot and Select proper Boot device Windows XP Forum 15. Juni 2009
Menu "Select boot device" ausschalten Windows XP Forum 22. Feb. 2006