#oracle #debugging #datagrip
Вопрос:
у кого-нибудь здесь есть общие советы по отладке подпрограмм oracle и/или пакетов с помощью DataGrip (даже по их запуску/работе/отладке)?
Проблемы, которые у меня есть, заключаются в следующем:
1 Я не понимаю последнюю часть кода, которую генерирует DataGrip
declare
result NUMBER;
someVar := 300198032;
begin
result := FN_GET_CLIENT_ORG_SEQ(V_someVar => someVar );
open ? for select result as result from dual;
end;
в конце есть это » открыто ? для выбора результата как результата из dual; «, что, черт возьми, является открытым ?
При нажатии кнопки для отладки он выводит этот диалог, пробовал разные комбинации (числа, строки и т. Д.), Но oracle жалуется и не запускается, в итоге я комментирую эту строку для отладки.
2 При выполнении шага я заметил, что после ввода некоторых инструкций кнопки отладки отключаются (шаг вперед, шаг внутрь и т. Д.). В основном DataGrip просто продолжает думать/зависает, и я не могу продолжать отладку.
Например, в этом случае мне нужно перешагнуть, чтобы отладка продолжала работать, если я войду, она зависнет
SELECT something, something
INTO somethingInto
FROM some table
Другой пример,
любые конечные состояния (которые определяют окончание процедуры) необходимо перешагнуть, если не зависает или не переходит в подвешенное состояние DataGrip.
3 Кажется, что сложнее использовать процедуры отладки DataGrip, содержащиеся в пакетах, либо в процессе отладки возникают проблемы, либо переходы, вероятно, являются самым безопасным способом заставить его работать.
Любые профессиональные советы будут высоко оценены
Ответ №1:
Я не знаю Datagrip, поэтому не могу помочь.
Однако посмотрите, поможет ли это с
что, черт возьми, такое открытое ?
Похоже на бизнес рефкурсоров. В следующем коде используется то же open
самое, что вы видели в своем коде. Он выбирает сотрудников, работающих в отделе, значение которого deptno
равно значению result
локальной переменной.
SQL> set serveroutput on
SQL> declare
2 result number := 10;
3 rc sys_refcursor; --> this is your "?" - a refcursor
4 l_name emp.ename%type;
5 begin
6 open rc for select ename from emp --> this is your "open"
7 where deptno = resu<
8
9 -- the following code just displays what's being fetched
10 loop
11 fetch rc into l_name;
12 exit when rc%notfound;
13 dbms_output.put_line(l_name);
14 end loop;
15 close rc;
16 end;
17 /
CLARK
KING
MILLER
PL/SQL procedure successfully completed.
SQL>
Комментарии:
1. спасибо, приятель, пробовал другие типы курсоров, но ваш конкретный тип заставил его работать !
Ответ №2:
Да, похоже, что теперь все стало более гладким благодаря тому, что «перешагнул через большинство строк «выбирает» или «конец». (позволяет избежать зависания/входа в подвешенное состояние)
Также заменяя ? объявлением sys_refcursor, захватывает/показывает результаты во время отладки
declare
result NUMBER;
someVar := 300198032;
rc sys_refcursor; -- < -- HERE
begin
result := FN_GET_CLIENT_ORG_SEQ(CLIENT_ID => someVar );
-- HERE (below)
open rc for select result as result from dual;
end;