Vấn đề là một trong những giải pháp tên.
Khi bạn có tham số hostname
và hostname
trong bảng mà bạn đang tham chiếu, các quy tắc phân giải phạm vi khiến hầu hết mọi người nhầm lẫn. Đó là lý do tại sao nhiều người khuyên bạn nên sử dụng quy ước đặt tên cho các tham số và biến cục bộ để phân biệt chúng với tên bảng. Ví dụ:trong mã của tôi, tôi sử dụng p_
thành tiền tố tên tham số và l_
để đặt tiền tố cho các biến cục bộ.
Trong mã của bạn, khi bạn có
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
được giải quyết dưới dạng cột trong bảng, không phải tham số. Điều này khiến truy vấn trả về mọi hàng trong bảng có hostname
không phải là null gây ra lỗi. Bạn có thể đặt tiền tố tên tham số một cách rõ ràng với tên hàm để buộc hostname
để giải quyết tham số
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
Điều đó hoạt động. Nhưng việc thêm tiền tố tên hàm thường gây khó chịu. Nếu bạn áp dụng quy ước về tiền tố tên tham số và tên biến cục bộ, bạn sẽ nhận được một cái gì đó giống như
FUNCTION GET_SYSTEMID(p_hostname varchar2)
RETURN NUMBER
IS
l_sysID number;
BEGIN
SELECT mySystems.SYSTEMID
INTO l_sysID
FROM mySystems
where mySystems.HOSTNAME = p_hostname;
return l_sysID;
END GET_SYSTEMID;
Điều đó cũng hoạt động và có xu hướng (theo suy nghĩ của tôi) rõ ràng hơn việc thêm tiền tố tên hàm rõ ràng ở khắp nơi.