sql >> Databáze >  >> RDS >> Oracle

Provést okamžitý výběr nevrátí žádné hodnoty

Musíte vybrat do něco. Pokud tak neučiníte, pak dotaz není ani provedeno (ačkoli je analyzován).

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

Ale v žádném konkrétním pořadí:(a) měli byste použít proměnné vazby místo toho, abyste měli doslovnou hodnotu 1 vloženou do dynamického příkazu; (b) nemusí to být vůbec dynamické; a (c) volající stejně neuvidí hodnoty vrácené dotazem – pokud nezvolíte možnost OUT argumenty nebo je zobrazte pomocí dbms_output() (ačkoli by se to mělo skutečně používat pouze pro ladění, protože nemůžete ovlivnit, zda to klient zobrazí).

Takže můžete udělat:

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

nebo

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

a nechat volajícího předat své vlastní názvy proměnných, které se mají naplnit, a pak s nimi dělat, co potřebuje. Volající obvykle také předá ID, které hledáte, takže 1 nemáte pevně zakódované.

Nezdá se však, že by postup byl skutečně tím nejlepším mechanismem.

Také pomocí select ... into (statické nebo dynamické) dojde k chybě, pokud dotaz vrátí nula řádků nebo více než jeden řádek. Bude fungovat pouze v případě, že je vrácen přesně jeden řádek. Kurzor by zvládl libovolný počet řádků – ale pokud zrovna netisknete výsledky (jak ukazuje @Jayanth), musíte místo toho předat kurzor zpět volajícímu. Můžete provést bulk collect into místo toho sbírku, ale stále s tím musíte něco udělat.



  1. Oracle ORA-00979 - není výraz GROUP BY

  2. Jak najdu krabici správné velikosti pro každý produkt?

  3. zřetězená funkce s parametrem kurzoru oracle

  4. připojení MySQL serveru k NetBeans