2012-03-29 5 views
3

Ich möchte einen bestimmten Spaltenwert a.id und speichern Sie es in eine Variable v_id. Verwenden Sie dann diesen Wert, um eine gespeicherte Prozedur zu übergeben.Wählen Sie einen einzelnen Spaltenwert und speichern Sie ihn in der Variablen Oracle sql

DECLARE v_id a.id%TYPE; 
BEGIN 
SELECT id into v_id from a where a.name='test' and rownum <2 order by id desc; 
Print v_id; 
doSomething(v_id); 
END; 
/

Ich erhalte diesen Fehler in SQL Developer:

Bericht Fehler: ORA-06550: Zeile 3, Spalte 7: PLS-00103: Fand das Symbol "V_ID", wenn erwartet eine der folgenden:

: =. (@%; Das Symbol ": =" wurde für "V_ID" durch ersetzt. 06550. 00000 - "Zeile% s, Spalte% s: \ n% s" * Ursache: Normalerweise ein PL/SQL-Kompilierungsfehler * Aktion:.

Antwort

10

Wenn Sie rownum verwenden möchten, und order by Sie haben indem sie in einer Unterabfrage, die Ordnung zu bringen. Es gibt keinen anderen Weg, um sicherzustellen, dass Sie den richtigen Wert erhalten.

Es ist auch eine gute Übung, sich mit der Möglichkeit zu befassen, dass es keine id gibt, die Ihrer Abfrage entspricht. Ich habe einen zusätzlichen begin... end; Block hinzugefügt, um damit umzugehen.

declare 
    v_id a.id%type; 
begin 

    begin 
     select id into v_id 
     from (select id 
       from a 
       where name = 'test' 
       order by id desc) 
     where rownum < 2 
      ; 
    exception when no_data_found then 
     v_id := null; 
    end; 

    dbms_output.put_line(v_id); 
    doSomething(v_id); 

end; 
/

Wie @raukh bemerkt (während ich dies schreibe!) Das Problem print ist, die für das dbms_output.put_line()

+0

Danke für die extra Robustheit, du warst zuerst, also bekommst du das Häkchen, nehme ich an :) – Th3sandm4n

4

Dies.

Print v_id; 

nicht gültig ist wahrscheinlich gemeint Sie:

dbms_output.put_line(v_id); 

(Beachten Sie, dass Sieausführen müssen möglicherweise

?
set serveroutput on; 

vorher, um die oben einen Effekt zu haben.)

+0

Vielen Dank sein sollte, meine Gedanken woanders ist :) – Th3sandm4n

2

PRINT kein gültiger PL/SQL-Befehl ist, so dass ein Problem zu schaffen geht. Vielleicht wollte man

DECLARE 
    v_id a.id%TYPE; 
BEGIN 
    SELECT id 
    into v_id 
    from (SELECT id 
      FROM a 
      where a.name='test' 
      order by id desc) 
    where rownum < 2; 
    dbms_output.put_line(v_id); 
    doSomething(v_id); 
END; 
/
+0

Danke, mein Kopf ist anderswo, denke ich. Ich hätte schwören können, dass der Druck früher funktioniert hat. – Th3sandm4n

Verwandte Themen