sql >> Database >  >> RDS >> Oracle

Directe selectie uitvoeren geeft geen waarden terug

U moet in . selecteren iets. Als u dat niet doet, moet u de query wordt niet eens uitgevoerd (hoewel het geparseerd is).

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  execute immediate
  'select name, surname
  from student
  where id_student = 1'
  into l_name, l_surname;
end;
/

Maar, in willekeurige volgorde:(a) u moet bindvariabelen gebruiken in plaats van de letterlijke waarde 1 in te bedden in de dynamische instructie; (b) dit hoeft helemaal niet dynamisch te zijn; en (c) de beller kan de door de query geretourneerde waarden toch niet zien - tenzij u selecteert in OUT argumenten in plaats daarvan, of toon ze met dbms_output() (hoewel dat eigenlijk alleen zou moeten worden gebruikt voor debuggen, omdat je niet kunt bepalen of de client het zal laten zien).

Dus je zou kunnen doen:

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  select name, surname
  into l_name, l_surname
  from student
  where id_student = 1;

  dbms_output.put_line('name=' || l_name ||', surname=' || l_surname);
end;
/

of

create or replace procedure select_procedure (
  p_name OUT student.name%TYPE,
  p_surname OUT student.name%TYPE
)
as
begin
  select name, surname
  into p_name, p_surname
  from student
  where id_student = 1;
end;
/

en laat uw beller zijn eigen variabelenamen doorgeven om te vullen, en doe er vervolgens mee wat nodig is. De beller geeft meestal ook de ID door die u zoekt, dus u heeft de 1 niet hard gecodeerd.

Het lijkt er echter op dat een procedure hier niet echt het beste mechanisme voor is.

Gebruik ook een select ... into (statisch of dynamisch) zal een foutmelding geven als de query nul rijen of meer dan één rij retourneert. Het werkt alleen als er precies één rij wordt geretourneerd. Een cursor kan een willekeurig aantal rijen verwerken - maar tenzij u alleen de resultaten afdrukt (zoals @Jayanth laat zien), moet u de cursor in plaats daarvan teruggeven aan de beller. Je zou een bulk collect into een verzameling, maar daar moet je toch iets mee doen.



  1. MySQL LEFT JOIN-fout

  2. Is de CURRENT_TIMESTAMP-functie van Oracle echt een functie?

  3. Een externe sleutel toevoegen aan een bestaande tabel

  4. Aankomende verjaardagen zoeken met jOOQ