Как правильно использовать запрос SELECT в хранимой процедуре?
В хранимой процедуре необходимо назначить запрашиваемый набор результатов переменной (или переменным), которые соответствуют проекции:
select << column >>, << column >>
into << variable >>, << variable >>
from table_name
....
Этот оператор SQL возвращает более 1 строки, значит ли это, что мне нужно использовать курсор?
Курсор - это один из способов его обработки.Хотя цикл курсора обычно является лучшим подходом:
for r in ( SELECT *
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD')
) loop
Заполнение переменной коллекции - это другой подход, использующий BULK COLLECT:
select << column >>
bulk collect into << collection >>
from table_name
....
Если в таблице 15 столбцов,в качестве вывода мне нужно установить их все?
Вы можете создать пятнадцать различных переменных.Однако, если проекция вашего запроса совпадает с проекцией таблицы (что и с select *
), вы можете использовать конструкцию %rowtype
для определения переменной записи или коллекции:
declare
l_rec TABLE_NAME%rowtype; -- single row
type t_rec is table of TABLE_NAME%rowtype; -- multiple rows
l_recs t_rec
begin
SELECT *
bulk collect into l_recs
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD');
Мне нужновзять результат и показать эти данные на веб-странице.
Для возврата результатов вам, вероятно, просто нужно вернуть курсор курсора.Это просто указатель, который отображается на такие конструкции, как JDBC ResultSet и ODBC ResultSet.Для PHP это будет oci_new_cursor
. Узнать больше .
Create or replace procedure get_recs
(FIRST_DATE in varchar2,
SECOND_DATE in varchar2,
OUT_RECS out sys_refcursor
) is
Begin
Open out_recs for
SELECT *
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD');
End;
Кстати, вы, похоже, ожидаете передать параметры в виде строк: было бы лучше передать их как фактические даты.