Helpex - Trao đổi & giúp đỡ Đăng nhập
14

Tôi muốn viết một hàm Oracle thu thập một số dữ liệu theo nhiều bước vào một biến tập hợp và sử dụng dữ liệu thu thập đó trong một truy vấn SELECT như trong ví dụ rất đơn giản này:

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(0) := 1;
  MyList(1) := 2;
  MyList(2) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId NOT IN MyList;
  RETURN MyName;
END TESTFUNC01;

Thật không may, phần "NOT IN MyList" không phải là SQL hợp lệ. Có cách nào để đạt được điều này?

14 hữu ích 0 bình luận 49k xem chia sẻ
18

Những gì bạn đang tìm kiếm là tablechức năng:

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(1) := 1;
  MyList(2) := 2;
  MyList(3) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId NOT IN (select * from table(MyList));
  RETURN MyName;
END TESTFUNC01;
18 hữu ích 1 bình luận chia sẻ
6

Bạn có thể làm như thế này:

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(1) := 1;
  MyList(2) := 2;
  MyList(3) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId NOT IN (SELECT COLUMN_VALUE FROM TABLE(MyList));
  RETURN MyName;
END TESTFUNC01;

Lưu ý rằng tôi cũng đã thay đổi các chỉ số danh sách. Bắt đầu bằng 1 (không phải 0).

6 hữu ích 0 bình luận chia sẻ
6

Nếu bạn đang sử dụng oracle 10, bạn có thể sử dụng các phần mở rộng của bộ sưu tập:

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(1) := 1;
  MyList(2) := 2;
  MyList(3) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId MEMBER OF MyList;
  RETURN MyName;
END TESTFUNC01;

để biết thêm chi tiết xem bài đăng này

6 hữu ích 0 bình luận chia sẻ
4

- INT_LIST được khai báo trên toàn cầu là "TYPE INT_LIST LÀ BẢNG TÍNH INTEGER"

Điều đó trông giống như một khai báo PL / SQL. Câu lệnh SELECT sử dụng công cụ SQL. Điều này có nghĩa là bạn cần khai báo TYPE của mình trong SQL.

CREATE TYPE INT_LIST AS TABLE OF NUMBER(38,0);
/

Sau đó, bạn có thể sử dụng nó trong một câu lệnh SELECT:

SELECT Name INTO MyName
FROM Item WHERE ItemId NOT IN (select * from table(MyList));

Tất nhiên, bạn cần đảm bảo rằng truy vấn của bạn chỉ trả về một hàng hoặc chương trình của bạn xử lý ngoại lệ TOO_MANY_ROWS.

4 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ oracle collections plsql , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading