Oracle
 sql >> база данни >  >> RDS >> Oracle

Изпълнението на незабавен избор не връща стойности

Трябва да изберете в нещо. Ако не го направите, тогава заявката дори не се изпълнява (въпреки че е анализиран).

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

Но без конкретен ред:(a) трябва да използвате свързващи променливи, вместо да имате литералната стойност 1, вградена в динамичния израз; (б) това изобщо не е необходимо да бъде динамично; и (c) повикващият така или иначе няма да може да види стойностите, върнати от заявката - освен ако не изберете OUT аргументи вместо това или ги покажете с dbms_output() (въпреки че това наистина трябва да се използва само за отстраняване на грешки, тъй като не можете да контролирате дали клиентът ще го покаже).

Така че можете да направите:

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

или

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

и накарайте вашия повикващ да предаде свои собствени имена на променливи, които да попълни, и след това да направи каквото трябва с тях. Обаждащият се обикновено предава и идентификатора, който търсите, така че нямате 1 твърдо кодиран.

Въпреки това не изглежда, че процедурата наистина е най-добрият механизъм за това.

Освен това, използвайки select ... into (статичен или динамичен) ще даде грешка, ако заявката върне нула реда или повече от един ред. Ще работи само ако има върнат точно един ред. Курсорът би обработил произволен брой редове - но освен ако просто не отпечатвате резултатите (както показва @Jayanth), вместо това трябва да предадете курсора обратно на повикващия. Можете да направите bulk collect into вместо това колекция, но все пак трябва да направите нещо с това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DBD::Инсталацията на Oracle причинява грешка

  2. Как да премахнете множество интервални дялове въз основа на дата?

  3. как да използвам xmltable в oracle?

  4. Как да пренасоча изхода на DBMS_OUTPUT.PUT_LINE към файл?

  5. Не може да се изпълни динамична заявка в съхранена процедура, докато се избира брой записи