Как использовать запрос SELECT в хранимой процедуре (Oracle)? - PullRequest
0 голосов
/ 20 октября 2018

Я использую Oracle 12c .Я знаю, что мой следующий вопрос не нов, но я немного растерялся и мне нужна помощь.

У меня есть SQL-оператор:

SELECT * 
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD') 
                      AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD')

Вопросы:

  1. Как правильно использовать SELECT запрос в хранимой процедуре?

  2. Этот оператор SQL возвращает более 1 строки, значит ли это, что мне нужно использовать курсор?

  3. Если в таблице 15 столбцов, в качестве вывода мне нужно установить их все?

РЕДАКТИРОВАТЬ :

CREATE OR REPLACE PROCEDURE PROCEDURE_NAME
(
    FIRST_DATE IN VARCHAR2(10),
    SECOND_DATE IN VARCHAR2(10)
)
AS
    oracle_cursor SYS_REFCURSOR;
BEGIN
    OPEN oracle_cursor FOR
        SELECT *
        FROM scheme_name.table_name
        WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD') AND TO_DATE(SECOND_DATE, 'YYYY-MM-DD');
    DBMS_SQL.RETURN_RESULT(oracle_cursor);
END PROCEDURE_NAME;

1 Ответ

0 голосов
/ 20 октября 2018

Как правильно использовать запрос 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;

Кстати, вы, похоже, ожидаете передать параметры в виде строк: было бы лучше передать их как фактические даты.

...