Код, подобный этому, является плохой практикой:
WHERE C.COMPANYID=COMPANYID
Очевидно, что разработчик, написавший его, считал очевидным, что, без псевдонима и без префикса, COMPANYID
ссылается на параметр с тем же именем.Фактически, компилятор применяет соответствующую метку, ближайшую по объему, которая является именем столбца таблицы .Так что предложение WHERE интерпретируется как
WHERE C.COMPANYID=C.COMPANYID
То есть where 1=1
.Нехорошо.Таким образом, переименование параметров в нечто особенное имеет решающее значение.
Плохая новость в том, что волшебного способа сделать это не существует.Вам придется редактировать источник каждой процедуры вручную.Не допускайте возможности использования регулярных выражений в глобальной операции поиска и замены.Из примера, который вы разместили здесь, ссылки на столбцы не всегда являются псевдонимами, поэтому нет способа написать выражение поиска и замены, которое могло бы сказать (например), что COMPANYID
в GROUP BY COMPANYID
является столбцом, а не параметром.
Так что, к сожалению, у вас есть долгая и утомительная попытка найти каждое вхождение имени параметра, решить, является ли он на самом деле параметром, и изменить его при необходимости.Постарайтесь не тратить слишком много времени на то, чтобы пожелать изобретательских пыток разработчикам, написавшим оригинальные сценарии.Хотя это может быть интересно, это отвлекает и приведет к появлению новых ошибок или отсутствию существующих.
Вот скрипт, который вы можете использовать, чтобы охватить задачу вперед (при условии, что у вас есть схемагде эти процедуры скомпилированы).
select package_name
, object_name as procedure_name
, argument_name as parameter_name
, case when length(argument_name) > 28 then '!' end as uh_oh
from user_arguments
where position > 0 -- eliminate function return values
and argument_name in ( select column_name from user_tab_columns )
order by package_name
, object_name
, position
Подзапрос на user_tab_columns
является необязательным.Это позволяет вам обращаться только к тем параметрам, которые являются проблемными прямо сейчас.Опустите его, если вы хотите использовать все параметры.
Атрибут uh_oh
будет определять параметры, которые слишком длинны для переименования с простым префиксом P_
.Вы предложили, что код предлагает PARAM_
в качестве префикса, но он неоправданно длинен и, вероятно, вызовет больше изменений имени, чем двухсимвольный префикс.