sql >> Database teknologi >  >> RDS >> Oracle

Udfør øjeblikkelig valg returnerer ingen værdier

Du skal vælge til noget. Hvis du ikke gør det, så forespørgslen er ikke engang udført (selvom det er parset).

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;
/

Men uden bestemt rækkefølge:(a) du bør bruge bindevariabler i stedet for at have den bogstavelige værdi 1 indlejret i den dynamiske sætning; (b) dette behøver slet ikke at være dynamisk; og (c) den, der ringer, vil alligevel ikke være i stand til at se værdierne returneret af forespørgslen - medmindre du vælger OUT argumenter i stedet for, eller vis dem med dbms_output() (selvom det egentlig kun skal bruges til fejlretning, da du ikke kan kontrollere, om klienten vil vise det).

Så du kunne gøre:

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;
/

eller

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;
/

og få din opkalder til at sende sine egne variabelnavne til at udfylde, og derefter gøre, hvad den har brug for med dem. Den, der ringer op, vil normalt også indgive det ID, du leder efter, så du ikke har 1'et hårdtkodet.

Det ser dog ikke ud til, at en procedure virkelig er den bedste mekanisme til dette.

Brug også en select ... into (statisk eller dynamisk) vil fejle, hvis forespørgslen returnerer nul rækker eller mere end én række. Det vil kun virke, hvis der er præcis én række returneret. En markør ville håndtere et hvilket som helst antal rækker - men medmindre du bare udskriver resultaterne (som @Jayanth viser), skal du i stedet sende markøren tilbage til den, der ringer. Du kunne foretage en bulk collect into en samling i stedet for, men det skal du stadig gøre noget ved.



  1. Aggregering efter medianværdi i SQL

  2. Grundlæggende om SQL Server Task Automation

  3. Eksport af en tabel fra Amazon RDS til en CSV-fil

  4. Brug af setDate i PreparedStatement