programing

pl/sql 저장 프로시저: 매개 변수 이름이 열 이름과 같습니다.

linuxpc 2023. 7. 10. 22:08
반응형

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에 "=" 뒤의 값이 열이 아니라 매개 변수여야 한다고 지시하는 방법이 있습니까?

도와주셔서 고마워요.

다음과 같이 매개 변수 및 변수 이름 앞에 절차 이름을 붙일 수 있습니다.

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.

해결책을 찾았습니다.매개 변수를 완전히 검증함으로써 작동합니다.

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;

당신이 설명한 것을 변수 그림자라고 합니다.그것은 어떤 언어로도 일어날 수 있습니다.좋은 해결 방법이 제공되었지만 일반적인 해결 방법은 이러한 일이 발생하지 않도록 명명 체계를 설계하는 것입니다.

예를 들어, 접두사 없이 열 이름을 지정하고 범위에 따라 달라지는 접두사로 변수를 지정합니다.P_매개 변수의 경우,L_로컬 변수의 경우,G_글로벌 패키지 변수 등의 경우).이렇게 하면 추가 정보를 제공하여 코드를 더 읽기 쉽게 만들 수 있습니다.

접두사 추가에 대한 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;

언급URL : https://stackoverflow.com/questions/1607891/pl-sql-stored-procedure-parameter-name-same-as-column-name

반응형