Хранимая процедура 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, что значение после "=" должно быть параметром, а не столбцом?
Спасибо за помощь
Ответы
Ответ 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;