Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

PL / SQL viết lại truy vấn nối với mệnh đề 'IN'

tôi đoán là bạn đã thực hiện một số bước trước đó để đưa id vList vào một chuỗi phân tách (bạn không nói vList được điền như thế nào). Tại sao không giữ như một truy vấn?

begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...

Việc chuyển đổi ngữ cảnh khi chạy nhiều lần có thể gây khó khăn, nhưng với tôi phần tồi tệ nhất là bạn đang chấp nhận một cách mù quáng đầu vào tham số là một danh sách các con số, khi nó thực sự có thể là bất cứ thứ gì. Nó có thể (vô tội) là '1,2, X' và bạn sẽ gặp lỗi thời gian chạy "số không hợp lệ". Hoặc tệ hơn, nó có thể là một cuộc tấn công SQL injection. Nói chung, cách thực hành không tốt của nó (dynamic sql có vị trí của nó), nhưng chắc chắn KHÔNG phải cách bạn đang sử dụng nó.

Hãy thử một cái gì đó như sau:

create or replace type t_num_tab as table of number;

create or replace procedure test_proc(i_list in t_num_tab) as
  type t_name_tab is table of varchar2(100);
  l_names t_name_tab;
begin
  -- get names
  select name
  bulk collect into l_names
  from user_table
  where id in (select * from table(i_list));

  -- do something with l_names
  dbms_output.put_line('Name count: ' || l_names.count);

end;

Bạn có thể tạo một loại đối tượng nếu bạn cần thứ gì đó phức tạp hơn một danh sách số.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập dữ liệu từ tệp csv

  2. Truy vấn hiển thị đầu ra theo chiều ngang

  3. Xử lý dữ liệu JSON lớn do API Web trả về

  4. Số Dapper Oracle (10,0) được trả về dưới dạng lỗi Bộ phân tích cú pháp thập phân

  5. hàm tổng hợp sql oracle với các giá trị mặc định