pl / sql хранимая процедура для выбора из таблицы, где дата равна параметру хранимой процедуры - PullRequest
0 голосов
/ 12 февраля 2020

Я новичок в PL / SQL и oracle, я использую SQL developer 19 против базы данных Oracle 12 C. Все, что я пытаюсь сделать, как я привык делать в T- SQL, - это выбрать некоторые данные из таблицы, где значение поля даты находится между двумя параметрами хранимой процедуры; ниже хранимой процедуры, которую я использую, которая выдает мне ошибку, говорящую, что я должен "ВЫБРАТЬ В" ??

create or replace PROCEDURE GET_DMR_HALO_VALUES ( START_DATE IN DATE , END_DATE IN DATE ) 
AS 

BEGIN    
SELECT 
HALO_RECORD_ID ,
ASSET_ID ,
ASSET_NAME ,
NUMERIC_VALUE ,
IS_ENABLED ,
ADDED_BY ,
VALUE_DATE ,
NOTES ,
DATE_ADDED  

FROM halo_inputs

WHERE trunc(value_date) BETWEEN START_DATE and END_DATE;

END GET_DMR_HALO_VALUES;

тогда у меня также есть другая проблема ... предполагая, что вышеприведенное работает, я пытаюсь просмотреть возвращенные данные таблицы, вызвав хранимую процедуру в SQL developer следующим образом

  DEFINE START_DATE date := TO_DATE('2019-02-12','YYYY-DD-MM');
  DEFINE END_DATE date := TO_DATE('2019-02-12','YYYY-DD-MM');

   exec GET_DMR_HALO_VALUES(:START_DATE, :END_DATE );

Правильно ли я назвал SP, как указано выше?

ОБНОВЛЕНИЕ

после просмотра этой статьи над стеком Я изменил сохраненный выполните следующую процедуру

create or replace PROCEDURE GET_DMR_HALO_VALUES ( START_DATE IN DATE , END_DATE IN DATE ) 
AS 
c1 sys_refcursor;
BEGIN
open c1 for
SELECT 
HALO_RECORD_ID ,
ASSET_ID ,
ASSET_NAME ,
NUMERIC_VALUE ,
IS_ENABLED ,
ADDED_BY ,
VALUE_DATE ,
NOTES ,
DATE_ADDED  

FROM halo_inputs

WHERE trunc(value_date) BETWEEN START_DATE and END_DATE;

dbms_sql.return_result(c1);

END;

но являются ли курсоры единственным способом в Oracle получить данные таблицы?

ОБНОВЛЕНИЕ 2 Я также изменил запрос exe c как следует

DECLARE 
START_DATE date := TO_DATE('12-02-20','DD-MM-YY');
END_DATE date := TO_DATE('12-02-20','DD-MM-YY');

BEGIN
    GET_DMR_HALO_VALUES(START_DATE,END_DATE );
END;

, и это работает, но как заставить разработчика SQL отображать данные в виде таблицы, а не в виде обычного текста?

1 Ответ

0 голосов
/ 12 февраля 2020

Самый простой вариант, чтобы этот запрос возвращал данные в сетке данных, это ... ну, запустить его вне хранимой процедуры. Процедуры хороши , но не так хороши для того, что вы хотите.

При возврате чего-либо функция может быть лучшим выбором. Например:

Сначала создайте его:

SQL> create or replace FUNCTION f_test (par_deptno in number)
  2    return sys_refcursor
  3  is
  4    l_rc sys_refcursor;
  5  begin
  6    open l_rc for
  7      select empno, ename, job, sal
  8      from emp
  9      where deptno = par_deptno;
 10    return l_rc;
 11  end;
 12  /

Function created.

Затем назовите его:

SQL> select f_test(10) from dual;

F_TEST(10)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7782 CLARK      MANAGER         2450
      7839 KING       PRESIDENT       5000
      7934 MILLER     CLERK           1300


SQL>

В SQL Developer, вы запустите последний оператор (select f_test(10) from dual;) в виде скрипта (сочетание клавиш F9), и затем он отобразит результат красиво (как показано в моем примере выше, хотя это SQL плюс вывод инструмента командной строки ). Тем не менее, он все еще не будет в сетке данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...