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

thực thi truy vấn SQL được lưu trữ trong bảng

Đây có vẻ như là một yêu cầu rất đặc biệt, và một yêu cầu sẽ khó giải quyết một cách mạnh mẽ. STMT_OR_VALUE là hiện thân của kiểu chống lại Tập quán Một cột Hai. Hơn nữa, việc giải quyết STMT_OR_VALUE yêu cầu logic điều khiển luồng và sử dụng SQL động. Do đó, nó không thể là một giải pháp SQL thuần túy:bạn cần sử dụng PL / SQL để lắp ráp và thực thi truy vấn động.

Đây là một bằng chứng về khái niệm cho một giải pháp. Tôi đã chọn một hàm mà bạn có thể gọi từ SQL. Nó phụ thuộc vào một giả định:mọi chuỗi truy vấn bạn chèn vào TEST1.STMT_OR_VALUE có hình chiếu của một cột số và mọi chuỗi giá trị là CSV chỉ của dữ liệu số . Với điều kiện này, thật đơn giản để xây dựng một hàm thực thi một truy vấn động hoặc mã hóa chuỗi thành một chuỗi số; cả hai đều được thu thập hàng loạt vào một bảng lồng nhau:

create or replace function get_ids (p_name in test1.name%type) 
  return sys.odcinumberlist
is
  l_rec test1%rowtype;
  return_value sys.odcinumberlist;
begin

  select * into l_rec
  from test1
  where name = p_name;

  if l_rec.type = 'SQL_QUERY' then 
    -- execute a query
    execute immediate l_rec.stmt_or_value
      bulk collect into return_value;
  else
    -- tokenize a string
    select xmltab.tkn
    bulk collect into return_value
    from ( select l_rec.stmt_or_value from dual) t
        , xmltable(  'for $text in ora:tokenize($in, ",") return $text'
                      passing stmt_or_value as "in"
                      columns tkn number path '.'
                   ) xmltab;
  end if;
  return return_value;
end;
/

Lưu ý rằng có nhiều cách để thực thi một câu lệnh SQL động và nhiều cách để mã hóa CSV thành một chuỗi số. Các quyết định của tôi là tùy ý:vui lòng thay thế các phương pháp ưa thích của bạn tại đây.

Hàm này có thể được gọi bằng table() gọi:

select * 
from data
where id in ( select * from table(get_ids('first'))) -- execute query
or    id in ( select * from table(get_ids('second'))) -- get string of values
/

Lợi ích lớn của phương pháp này là nó đóng gói logic xung quanh việc đánh giá STMT_OR_VALUE và ẩn việc sử dụng Dynamic SQL. Do đó, có thể dễ dàng sử dụng nó trong bất kỳ câu lệnh SQL nào trong khi vẫn giữ được khả năng đọc hoặc thêm các cơ chế khác để tạo một tập hợp các ID.

Tuy nhiên, dung dịch này giòn. Nó sẽ chỉ hoạt động nếu các giá trị trong test1 bảng tuân theo các quy tắc. Có nghĩa là, chúng không chỉ phải được chuyển đổi thành một dòng các số đơn lẻ mà các câu lệnh SQL phải hợp lệ và có thể thực thi được bằng EXECUTE IMMEDIATE. Ví dụ:dấu chấm phẩy ở cuối trong dữ liệu mẫu của câu hỏi không hợp lệ và sẽ gây ra lỗi THỰC HIỆN NGAY LẬP TỨC. SQL động rất khó vì nó chuyển đổi lỗi biên dịch thành lỗi thời gian chạy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thêm mệnh đề where vào thực thể bảng tham gia Hibernate @OneToMany rõ ràng?

  2. Cần trợ giúp liên kết các bảng tiên tri trong MS Access

  3. In giá trị của một biến trong SQL Developer

  4. Lỗi SQL:ORA-00942 bảng hoặc dạng xem không tồn tại

  5. Trong SQL * Plus, làm cách nào để thay đổi lời nhắc hiển thị người dùng và cơ sở dữ liệu được kết nối?