Как вы можете переименовать переменные в хранимой процедуре Oracle? - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужен способ переименования переменных в большом пакете хранимых процедур Oracle.Проблема, которую я вижу, состоит в том, что имена переменных хранимых процедур также являются именами столбцов в таблице, поэтому редактирование, замена не будут работать.

Так, например, в следующей процедуре, как я могу заменить переменную с именем: COMPANYID, которая будет называться PARAM_COMPANYID?

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

CREATE OR REPLACE PROCEDURE          SP_TEST(
, COMPANYID IN integer default null
, OUTPUT OUT types.cursor_type  
) AS


BEGIN

OPEN OUTPUT FOR

SELECT   
  COMPANYID
  FIRSTNAME,
  LASTNAME,    

from
(
    select distinct 
    COMPANYID
    FIRSTNAME,
    LASTNAME
    FROM ALL_COMPANYS C
    WHERE C.COMPANYID=COMPANYID

) TEMP
where TEMP.COMPANYID = DECODE(COMPANY,0,COMPANYID,NVL(COMPANY,COMPANYID))  

GROUP BY 
  COMPANYID
  FIRSTNAME,
  LASTNAME;

Конечный результат будет выглядеть следующим образом

CREATE OR REPLACE PROCEDURE          SP_TEST(
, PARAM_COMPANYID IN integer default null
, OUTPUT OUT types.cursor_type  
) AS


BEGIN

OPEN OUTPUT FOR

SELECT   
  COMPANYID
  FIRSTNAME,
  LASTNAME,    

from
(
    select distinct 
    COMPANYID
    FIRSTNAME,
    LASTNAME
    FROM ALL_COMPANYS C
    WHERE C.COMPANYID=PARAM_COMPANYID

) TEMP
where TEMP.COMPANYID = DECODE(COMPANY,0,COMPANYID,NVL(COMPANY,PARAM_COMPANYID))  

GROUP BY 
  COMPANYID
  FIRSTNAME,
  LASTNAME;

Если бы был способ переименовать все параметры SQL в конечный результат (см. Выше), я мог бы написать редактирование/ Заменить процесс с помощью C # для преобразования этих хранимых процедур в работающий встроенный скрипт.

1 Ответ

0 голосов
/ 12 декабря 2018

Код, подобный этому, является плохой практикой:

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_ в качестве префикса, но он неоправданно длинен и, вероятно, вызовет больше изменений имени, чем двухсимвольный префикс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...