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

Oracle - Trong câu hỏi CLAUSE khi sử dụng với nhiều giá trị, làm cho nó động

Thật không may, nếu loại bộ sưu tập của bạn được xác định trong PL / SQL (chứ không phải SQL), bạn không thể sử dụng nó trong SQL vì công cụ SQL không biết cách xử lý nó.

Nếu thay vào đó, bạn đã xác định loại tập hợp trong SQL, tức là

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

Sau đó, bạn có thể làm điều gì đó như

SELECT col1
  FROM table1 t1
 WHERE t1.id IN (SELECT column_value
                   FROM TABLE( <<variable of type varchar2_tbl>> ) )

tùy thuộc vào phiên bản Oracle - cú pháp để sử dụng bộ sưu tập trong SQL đã phát triển theo thời gian - các phiên bản cũ của Oracle có cú pháp phức tạp hơn.

Bạn có thể chuyển đổi một mảng liên kết PL / SQL (VARCHAR_ARRAY_TYPE của bạn) thành một tập hợp bảng lồng nhau SQL trong PL / SQL, nhưng điều đó yêu cầu lặp qua mảng kết hợp và điền vào bảng lồng nhau, điều này hơi khó. Giả sử rằng VARCHAR_TBL bộ sưu tập bảng lồng nhau đã được tạo sẵn

SQL> CREATE OR REPLACE TYPE varchar_tbl
         IS TABLE OF varchar2(40);

bạn có thể chuyển đổi từ mảng kết hợp sang bảng lồng nhau và sử dụng bảng lồng nhau trong một câu lệnh SQL như thế này (sử dụng bảng SCOTT.EMP)

declare
  type varchar_array_type
    is table of varchar2(40)
       index by binary_integer;
  l_associative_array varchar_array_type;
  l_index             binary_integer;
  l_nested_table      varchar_tbl := new varchar_tbl();
  l_cnt               pls_integer;
begin
  l_associative_array( 1 ) := 'FORD';
  l_associative_array( 10 ) := 'JONES';
  l_associative_array( 100 ) := 'NOT A NAME';
  l_associative_array( 75 ) := 'SCOTT';
  l_index := l_associative_array.FIRST;
  while( l_index IS NOT NULL )
  loop
    l_nested_table.EXTEND;
    l_nested_table( l_nested_table.LAST ) :=
             l_associative_array( l_index );
    l_index := l_associative_array.NEXT( l_index );
  end loop;
  SELECT COUNT(*)
    INTO l_cnt
    FROM emp
   WHERE ename IN (SELECT column_value
                     FROM TABLE( l_nested_table ) );
  dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
end;

Tuy nhiên, vì việc chuyển đổi giữa các kiểu tập hợp là một chút khó khăn, nói chung tốt hơn là bạn chỉ nên sử dụng tập hợp bảng lồng nhau (và chuyển nó vào thủ tục được lưu trữ) trừ khi có một lý do cụ thể nào đó mà mảng liên kết là cần thiết.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chức năng tổng hợp Oracle để trả về một giá trị ngẫu nhiên cho một nhóm?

  2. Chú thích Seam @Transactional không hoạt động?

  3. Làm cách nào để chọn tất cả các cột từ bảng, cùng với các cột bổ sung như ROWNUM?

  4. JDBC:Máy chủ ứng dụng Oracle và Bộ điều hợp mạng không thể thiết lập lỗi kết nối

  5. Sql Đặt hàng theo nhiều cột