sql >> Databasteknik >  >> RDS >> Oracle

Utför omedelbart val returnerar inga värden

Du måste välja in något. Om du inte gör det gör du frågan körs inte ens (även om det är tolkat).

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, i ingen speciell ordning:(a) du bör använda bindningsvariabler istället för att ha det bokstavliga värdet 1 inbäddat i den dynamiska satsen; (b) detta behöver inte alls vara dynamiskt; och (c) den som ringer kommer inte att kunna se värdena som returneras av frågan hur som helst - om du inte väljer OUT argument istället, eller visa dem med dbms_output() (även om det egentligen bara ska användas för felsökning eftersom du inte kan kontrollera om klienten ska visa det).

Så du kan göra:

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

och låt din uppringare skicka in sina egna variabelnamn för att fylla i, och gör sedan vad den behöver med dessa. Den som ringer skickar vanligtvis också in det ID du letar efter, så att du inte har 1:an hårdkodad.

Det verkar dock inte som om en procedur verkligen är den bästa mekanismen för detta.

Använd också en select ... into (statisk eller dynamisk) kommer att felas om frågan returnerar noll rader eller mer än en rad. Det fungerar bara om det finns exakt en rad som returneras. En markör skulle hantera hur många rader som helst - men om du inte bara skriver ut resultaten (som @Jayanth visar) måste du skicka tillbaka markören till den som ringer istället. Du kan göra en bulk collect into en samling istället, men det måste du ändå göra något åt.



  1. Hur undkommer jag % i Knex where like-fråga?

  2. hur släpper man partition utan att tappa data i MySQL?

  3. Vad är den maximala längden på data jag kan lägga i en BLOB-kolumn i MySQL?

  4. Radie på 40 kilometer med latitud och longitud