Почему эта процедура PL / SQL не работает? - PullRequest
1 голос
/ 16 декабря 2011

У меня есть курсор, который возвращает два значения: одно, которое я буду использовать (и, следовательно, назначу переменную out), и другое, которое я только возвратил, чтобы заставить работать ROWNUM.

Если я запускаю курсор как запрос, он работает как положено. Но если я выполню процедуру, переменная out станет пустой. Мой подход как-то не поддерживается? Я имею в виду, возвращая два значения, но используя только одно из них?

Вот мой код процедуры: (Не вдавайтесь в подробности самого запроса. Он работает, я знаю, что он немного уродливый, но он работает. Это был единственный способ вернуть второй-последний строка)

procedure retorna_infos_tabela_164(i_nip in varchar,
                               o_CODSDPANTERIOR out number) is
cursor c_tabela_164 is
    select *
    from(
        select CODSDP,ROWNUM rn
        from
              (
                select NRONIP,CODTIPOMOV,CODSDP
                from TB164_HISTORICOMOVIMENTACOES
                where NRONIP = i_nip and
                CODTIPOMOV='S1'
                order by DTHMOV desc
              )
        )
    where rn=2;

    v_temp_nr number;

begin
    open c_tabela_164;
    fetch c_tabela_164 into o_CODSDPANTERIOR,v_temp_nr;
    close c_tabela_164;
end retorna_infos_tabela_164; 

РЕДАКТИРОВАТЬ Я пытался запустить эту процедуру с помощью dbms_output.put_line(o_CODSDPANTERIOR), которая не работала. Затем я немного погуглил и увидел, что сначала должен TO_CHAR() мой var, а затем выводить его. Тоже не сработало.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Нет проблем с передачей числа в DBMS_OUTPUT.PUT_LINE. Oracle автоматически преобразует другие встроенные типы в VARCHAR2, используя формат по умолчанию. Вам нужно использовать TO_CHAR, только если вы хотите контролировать используемый формат - это часто хорошая идея, но, как правило, не обязательно.

Одна из возможностей, однако, заключается в том, что вы не видите вывод, потому что вы не включили его. Если вы запускаете свой тест в SQLPlus, убедитесь, что вы SET SERVEROUTPUT ON, прежде чем запускать код, который включает вызовы DBMS_OUTPUT. Если вы используете какой-то другой клиент, обратитесь к его документации для правильного включения DBMS_OUTPUT. (Конечно, вы можете проверить, включен ли он, добавив еще один вызов для вывода строкового литерала.)

Нет ничего плохого в методике, которую вы используете для заполнения параметра out. Однако нет необходимости возвращать два столбца из курсора; ваш select * может быть просто select CODSDP. Похоже, вы ошибочно полагаете, что любой столбец, указанный в предикатах, должен быть в списке выбора, но это не так. В вашем самом внутреннем запросе список выбора не обязательно должен включать NRONIP или CODTIPOMOV, потому что они не указаны во внешних блоках; предложение WHERE в этом запросе может ссылаться на любой столбец в таблице, независимо от того, находится ли он в списке выбора.

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

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

0 голосов
/ 16 декабря 2011

Мне жаль, что вы, ребята, нашли время, чтобы ответить мне, когда ответ был связан с инструментом, который я использую.Я надеюсь, что все вы, ребята, что-то узнали.

Запрос работает, по крайней мере, для меня, я не сталкивался с какими-либо крайними случаями, когда он не работает, но я не проверял его полностью.

Проблема заключалась в том, что TOAD , инструмент, который я использую для запуска процедур, иногда заполняет процедуры параметрами, которые я им сообщаю, но иногда это не так.т.Проблема заключалась в том, что я пытался выполнить процедуру без параметров, безрезультатно ...

Извлеченный урок: дважды проверьте сгенерированный код процедуры, когда вы запускаете процедуру, используя Правый клик> Выполнить процедуру в TOADверсия 9.

...