Nói rằng tôi có một bảng mẫu:Cách xử lý các tham số tùy chọn trong truy vấn SQL?
id_pk value
------------
1 a
2 b
3 c
Và tôi có một/block SQL mẫu PL, trong đó có một truy vấn mà hiện chọn một hàng duy nhất vào một mảng:
declare
type t_table is table of myTable%rowtype;
n_RequiredId myTable.id_pk%type := 1;
t_Output t_table := t_table();
begin
select m.id_pk, m.value
bulk collect into t_Output
from myTable m
where m.id_pk = n_RequiredId;
end;
Những gì tôi cần cần làm là triển khai khả năng chọn một hàng đơn lẻ thành mảng, như được hiển thị trong khối ở trên, HOẶC để chọn tất cả các hàng thành một mảng, nếu n_RequiredID
, thực tế là tham số do người dùng nhập, được đặt thành null
.
Và, câu hỏi là, cách tốt nhất để xử lý tình huống như thế nào?
tôi có thể nghĩ về sửa đổi where
khoản truy vấn của tôi với một cái gì đó như thế này:
where m.id_pk = nvl(n_RequiredId, m.id_pk);
nhưng tôi cho rằng điều đó sẽ làm chậm truy vấn nếu tham số sẽ không được null, và tôi nhớ Kyte cho biết một cái gì đó thực sự xấu về cách tiếp cận này.
Tôi cũng có thể nghĩ đến việc thực hiện logic PL/SQL sau:
if n_RequiredId is null then
select m.id_pk, m.value bulk collect into t_Output from myTable m;
else
select m.id_pk, m.value bulk collect
into t_Output
from myTable m
where m.id_pk = n_RequiredId;
end if;
Nhưng sẽ trở nên quá phức tạp nếu tôi gặp phải nhiều hơn một tham số của loại hình này.
Bạn sẽ tư vấn cho tôi điều gì?
Rất tuyệt! Điều này tiết kiệm trong ngày của tôi. Tuy nhiên, cái thứ nhất không làm việc coz nếu cột là nullable, mệnh đề này sẽ lọc giá trị null trong khi trong câu hỏi bạn sẽ không lọc các giá trị null trong trường hợp thứ hai. –