Oracle SQL Developer - отсутствует параметр IN или OUT в индексе:: 1
У меня возникают проблемы при тестировании этой простой хранимой процедуры в 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 ответа
Сэмми,
Объявление переменной должно быть refcursor вместо sys_refcursor. Также, когда вы печатаете результаты, вы печатаете саму переменную, поэтому нет необходимости в :: (который используется для обозначения того, что это переменная связывания).
Я смог успешно запустить следующий скрипт в SQL Developer (и, конечно, sql plus.) Для SQL Developer, запустите его как скрипт, используя 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;
Вот рабочий пример, объявите 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;
в противном случае ошибка не выглядит так, как должна выглядеть, если вы делаете все это от разработчика.
Но что я действительно думаю, так это то, что ваш 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;" должно сработать
Я рекомендую попросить вашего администратора обновить вашу версию SQL Developer. Ваш значительно устарел, и вы можете столкнуться с некоторыми неясными ошибками. (Я сделал, когда я пытался использовать версию 1) Вы должны быть на 2.1 сейчас.