Подтвердить что ты не робот

Хранимая процедура pl/sql: имя параметра совпадает с именем столбца

У меня есть хранимая процедура, подобная этой

procedure P_IssueUpdate
(
    Id in integer,
    ModifiedDate in date,
    Solution in varchar2
) AS
BEGIN
update T_Issue
Set
  ModifiedDate = ModifiedDate,
  Solution = Solution
where id = id;
END P_IssueUpdate;

моя проблема в том, что имя параметра совпадает с именем столбца таблицы. Есть ли способ проинструктировать sql, что значение после "=" должно быть параметром, а не столбцом?

Спасибо за помощь

4b9b3361

Ответ 1

Вы можете префикс имени параметра и переменной с именем процедуры следующим образом:

SQL> declare
  2     procedure p (empno number) is
  3        ename varchar2(10);
  4     begin
  5        select ename
  6        into p.ename
  7        from emp
  8        where empno = p.empno;
  9        dbms_output.put_line(p.ename);
 10     end;
 11  begin
 12     p (7839);
 13  end;
 14  /
KING

PL/SQL procedure successfully completed.

Ответ 2

то, что вы описали, называется переменной затенением. Это может произойти на любом языке. Вы получили хорошие обходные пути, но общее решение заключается в разработке схемы именования, чтобы этого никогда не было.

Например, назовите свои столбцы без префикса и у вас есть переменные с префиксом, который зависит от их объема (P_ для параметров, L_ для локальных переменных, G_ для глобальных переменных пакета и т.д.)., Это будет иметь дополнительное преимущество, чтобы сделать код более читаемым, предоставив вам дополнительную информацию.

Ответ 3

я нашел решение. он работает с полной квалификацией параметра:

procedure P_IssueUpdate
(
    Id in integer,
    ModifiedDate in date,
    Solution in varchar2
) AS
BEGIN
update T_Issue
Set
  ModifiedDate = P_IssueUpdate.ModifiedDate,
  Solution = P_IssueUpdate.Solution
where id = P_IssueUpdate.id;
END P_IssueUpdate;

Ответ 4

RE Vincent ответит о добавлении префикса - это решение работает до тех пор, пока кто-то не изменяет таблицу и не добавит столбец, имя которого сталкивается с именем параметра. Не все проходят через каждую строку кода, чтобы убедиться, что их изменения в таблице не будут конфликтовать с именами переменных или параметров. Рекомендация Oracle заключается в том, чтобы квалифицировать каждое имя параметра или переменной в запросе SQL.

Если вы работаете с анонимным блоком (вне процедуры), вы можете назвать блок и квалифицировать переменные таким образом:

<<MY_BLOCK>>
declare
   X   sys.USER_TABLES%rowtype;
   Y   sys.USER_TABLES.TABLE_NAME%type := 'some_table_name';
begin
   select UT.*
   into   MY_BLOCK.X
   from   sys.USER_TABLES UT
   where  UT.TABLE_NAME = MY_BLOCK.Y;
end MY_BLOCK;