Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wykonaj natychmiastowe zaznaczenie nie zwraca żadnych wartości

Musisz wybrać do coś. Jeśli tego nie zrobisz, zapytanie nie jest nawet wykonywany (chociaż jest analizowany).

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 w żadnej szczególnej kolejności:(a) należy używać zmiennych bind zamiast osadzania wartości literału 1 w instrukcji dynamic; (b) to wcale nie musi być dynamiczne; oraz (c) wywołujący i tak nie będzie mógł zobaczyć wartości zwracanych przez zapytanie - chyba że wybierzesz OUT zamiast tego argumenty lub wyświetl je za pomocą dbms_output() (chociaż tak naprawdę powinno to być używane tylko do debugowania, ponieważ nie możesz kontrolować, czy klient to pokaże).

Możesz więc zrobić:

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

lub

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

i niech twój rozmówca przekaże własne nazwy zmiennych do wypełnienia, a następnie zrobi z nimi wszystko, czego potrzebuje. Dzwoniący zwykle przekazuje również identyfikator, którego szukasz, więc nie masz 1 zakodowanego na stałe.

Wydaje się jednak, że procedura nie jest najlepszym do tego mechanizmem.

Ponadto, używając select ... into (statyczne lub dynamiczne) spowoduje błąd, jeśli zapytanie zwróci zero lub więcej niż jeden wiersz. Będzie działać tylko wtedy, gdy zostanie zwrócony dokładnie jeden wiersz. Kursor obsługiwałby dowolną liczbę wierszy - ale jeśli tylko nie drukujesz wyników (jak pokazuje @Jayanth), musisz zamiast tego przekazać kursor z powrotem do dzwoniącego. Możesz wykonać bulk collect into zamiast tego kolekcja, ale nadal musisz coś z tym zrobić.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dziwne zachowanie pełnego zewnętrznego sprzężenia w Oracle - jak to wytłumaczyć?

  2. Korzystanie z Oracle JDeveloper 12c z Oracle Database 12c na platformie Oracle Cloud, część 3

  3. Przetwarzaj SQL za pomocą sterownika Oracle JDBC

  4. Domyślny format DATY Oracle

  5. Jak wywołać funkcję lub procedurę Oracle za pomocą Hibernate (EntityManager) lub JPA?