хранимая процедура pl / sql: имя параметра совпадает с именем столбца - PullRequest
23 голосов
/ 22 октября 2009

У меня есть такая хранимая процедура

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, что значение после "=" должно быть параметром, а не столбцом?

Спасибо за вашу помощь

Ответы [ 4 ]

40 голосов
/ 22 октября 2009

Имена параметров и переменных можно добавлять к названию процедуры следующим образом:

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.
6 голосов
/ 22 октября 2009

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

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

4 голосов
/ 22 октября 2009

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

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;
3 голосов
/ 05 ноября 2009

RE Ответ Винсента о добавлении префикса - это решение работает до тех пор, пока кто-нибудь не изменит таблицу и не добавит столбец, имя которого совпадает с именем параметра. Не каждый просматривает каждую строку кода, чтобы убедиться, что их модификации таблицы не будут конфликтовать с именами переменных или параметров. 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;
...