советы по отладке datagrip oracle, пожалуйста

#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;