Вызов хранимой процедуры в SQL Developer, которая возвращает набор результатов? - PullRequest
1 голос
/ 27 июня 2019

Я новичок в Oracle, поэтому, пожалуйста, потерпите меня. Я искал, но я не нашел прямого ответа на это.

В SQL Developer я создал следующую хранимую процедуру. Я предполагаю, что он был создан, потому что он возвращает сообщение Procedure ORACLE_GET_TOP_N_TESTS compiled:

create procedure oracle_get_top_n_tests
(oracle_tests OUT SYS_REFCURSOR) 
AS 
BEGIN 
OPEN oracle_tests FOR
select * from sales.quiz_results;
END oracle_get_top_n_tests;
/

Теперь я хотел бы вызвать / выполнить хранимую процедуру для просмотра результирующего набора (оператор select). Я пробовал следующее, но я не вижу результатов:

variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );

/* Received message PL/SQL procedure successfully completed, but no result */

Что я делаю не так?

Я использую Database 11g Express Edition.

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Вы получаете результат, просто ничего с ним не делаете.Вы можете print it:

variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );
print mycursor

Вывод будет идти в окно вывода скрипта, а не в сетку.(Вам нужно сделать его функцией, или использовать функцию-обертку , чтобы получить выходные данные в сетке, и даже тогда есть дополнительный шаг для их просмотра.)


Простая функция-обертка:

create function oracle_get_top_n_tests_wrapper
RETURN SYS_REFCURSOR
AS
  oracle_tests SYS_REFCURSOR;
BEGIN
  oracle_get_top_n_tests (oracle_tests => oracle_tests);

  return oracle_tests;
END oracle_get_top_n_tests_wrapper;
/

, затем вызовите это как:

select oracle_get_top_n_tests_wrapper from dual;

Если вы запустите это как скрипт, то результаты все равно будут идти в окно вывода скрипта;если вы запустите его как оператор, он будет добавлен в таблицу результатов, но в виде одной строки / столбца, который можно развернуть, чтобы увидеть фактическое содержимое.


Если вы не застряли сЗатем вы можете заменить это на функцию, которой тогда не понадобится обертка:

-- drop function oracle_get_top_n_tests_wrapper
-- drop procedure oracle_get_top_n_tests

create function oracle_get_top_n_tests
RETURN SYS_REFCURSOR
AS
  oracle_tests SYS_REFCURSOR;
BEGIN
  OPEN oracle_tests FOR
  select * from sales.quiz_results;

  return oracle_tests;
END oracle_get_top_n_tests;
/

, а затем вызвать ее напрямую:

select oracle_get_top_n_tests from dual;

с такими же примечаниями нарезультаты, примененные к оболочке.

0 голосов
/ 27 июня 2019

Вы можете просто запустить оператор select на рабочем листе, чтобы увидеть результат.

Если вы хотите, чтобы объект возвращал набор результатов, я бы пошел с функцией, которая возвращает таблицу

простой учебникгде я узнал, что: Учебное пособие

, тогда вы просто запускаете инструкцию на листе select * from table(function_oracle_get_top_n_tests);

...