Oracle SQL Developer - отсутствует индекс IN или OUT в индексе :: 1 - PullRequest
0 голосов
/ 21 сентября 2010

У меня проблемы с тестированием этой простой хранимой процедуры в Oracle Sql Developer.Хранимая процедура делает простой выбор и возвращает курсор.

create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY

( projectId IN NUMBER,
  resultset_out OUT sys_refcursor
) AS

BEGIN

  OPEN resultset_out for
  SELECT * from GLIDE_HISTORY
  where GLIDE_HISTORY.PRJ_ID = projectId;
/*  DBMS_OUTPUT.PUT_LINE(resultset_out);*/

END GET_PROJECT_DRF_HISTORY;

Чтобы проверить эту процедуру, я использовал следующий скрипт:

variable results sys_refcursor;

exec get_project_drf_history(3345, :results);

print :results;

Будучи новичкоми oracle, и инструмент Sql Developer, я изо всех сил пытаюсь понять, в чем здесь ошибка.Я не могу проверить это в Sql * Plus, потому что у меня нет пароля для этого.Я использую Oracle Sql Developer 1.1.2.25 и Oracle 10g.

Кто-нибудь может мне помочь, пожалуйста?Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 21 сентября 2010

Sammy

Объявление переменной должно быть refcursor вместо sys_refcursor. Кроме того, когда вы печатаете результаты, вы печатаете саму переменную, поэтому нет необходимости в : (который используется для указания того, что это переменная связывания).

Мне удалось успешно запустить следующий скрипт в SQL Developer (и, конечно, sql plus.) Для разработчика SQL запустите его как скрипт, используя F5.

--Creating Procedure
create or replace procedure test_ref(
i_limit number,
o_results out sys_refcursor
) is
begin
   open o_results for 
      'select object_name 
        from all_objects
        where rownum < ' || i_limit;
end;
/

А затем сценарий, который вызывает эту процедуру. (извините как скрипт с использованием F5).

var c1 refcursor;

exec test_ref(10,:c1);

print c1;
0 голосов
/ 23 сентября 2010

Я рекомендую попросить вашего администратора обновить вашу версию SQL Developer. Ваш значительно устарел, и вы можете столкнуться с некоторыми неясными ошибками. (Я сделал, когда я пытался использовать версию 1) Вы должны быть на 2.1 сейчас.

0 голосов
/ 21 сентября 2010

вот рабочий пример, объявите refcursor, затем присвойте значение, вызвав ваш proc в анонимном блоке. затем вы печатаете его

var x REFCURSOR ;

declare
     /*a no cleanup procedure*/
      procedure GetMeMyRefCursor(outter out nocopy sys_refcursor) 
        as
        begin
             open outter for 
                    select level 
                     from dual 
                     connect by level <= 5;           
        end GetMeMyRefCursor;
begin
  GetMeMyRefCursor(:x); 
  /*note you pass in the refcursor you created via the :X*/
end ;
/ 

print x; 
/*now print it*/

/*LEVEL                  
---------------------- 
1                      
2                      
3                      
4                      
5*/ 

на основании комментария: Теперь, используя ваш комментарий, у вас возникла проблема с параметрами IN / OUT, а не с печатью (не прочитал заголовок только вопрос и другой ответ)

это работает: (на основе вашего кода)

create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY

( projectId     IN NUMBER,
  resultset_out OUT sys_refcursor
) AS

BEGIN

  OPEN resultset_out for
  SELECT level from dual connect by level <= projectId;
/*  DBMS_OUTPUT.PUT_LINE(resultset_out);*/

END GET_PROJECT_DRF_HISTORY;
/

var results REFCURSOR; 
--this needs to be REFCURSOR (at least in 10g and 11i)
exec GET_PROJECT_DRF_HISTORY(5, :results); 

print results;
/

Вы также можете отлаживать пакеты и процедуры непосредственно из SQL Developer (это может быть реальным спасением жизни) если вы хотите отлаживать в SQL Developer, это действительно просто:

в соединениях -> ваша схема здесь -> процедуры -> GET_PROJECT_DRF_HISTORY, щелкните правой кнопкой мыши и выберите «Скомпилировать для отладки». Затем в процедуре установите точку останова, затем щелкните правой кнопкой мыши и отладьте ее (это создаст анонимный блок - см. Ниже - где вы можете указать свои значения и т. Д.)

DECLARE
  PROJECTID NUMBER;
  RESULTSET_OUT sys_refcursor;
BEGIN
  PROJECTID := NULL;

  GET_PROJECT_DRF_HISTORY(
    PROJECTID => PROJECTID,
    RESULTSET_OUT => RESULTSET_OUT
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('RESULTSET_OUT = ' || RESULTSET_OUT);
END;

(http://www.oracle.com/technetwork/developer-tools/sql-developer/sqldeveloperwhitepaper-v151-130908.pdf стр. 11)

в противном случае ошибка не будет выглядеть так, как должна выглядеть, если вы делаете все это из Developer.

Но я действительно думаю, что ваш VAR неверен и, следовательно, его не существует!

variable results sys_refcursor;

Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
BINARY_FLOAT | BINARY_DOUBLE ] ]

Итак, исходя из моего первоначального примера "var x REFCURSOR;" должно работать

...