2013-03-20 11 views
14

Tôi đang truyền mảng String (plcListchar) đến Thủ tục lưu sẵn, tôi muốn sử dụng mảng String này trong mệnh đề IN().Mảng trong mệnh đề mệnh đề IN() trong PLSQL

tôi không thể sử dụng plcListchar trực tiếp trong mệnh đề IN(). Hãy để tôi chỉ ra cách tôi đang sắp xếp mảng chuỗi plcListchar trong JAVA.

String array[] = {"o", "l"}; 
ArrayDescriptor des = ArrayDescriptor.createDescriptor("CHAR_ARRAY", con); 
ARRAY array_to_pass = new ARRAY(des,con,array);    
callStmtProductSearch.setArray(4, array_to_pass); 

cho đóng thùng CHAR_ARRAY,

create or replace type CHAR_ARRAY as table of varchar2; 

tôi muốn sử dụng plcListchar tại khoản IN. sau đây là thủ tục lưu trữ của tôi.

CREATE OR REPLACE PROCEDURE product_search(
      status IN varchar2, 
      plcList IN varchar2, 
      i_culture_id IN number, 
      plcListchar IN CHAR_ARRAY, 
      status_name OUT varchar2, 
      culture_code OUT varchar2) 
AS 
    CURSOR search_cursor IS 
    SELECT p.status_name, p.culture_code 
       FROM [email protected] p 
       WHERE p.publishable_flag=1 
       AND p.isroll =0 
       AND status = '-1' 
       AND p.plc_status IN (  ); 
BEGIN 
      OPEN search_cursor; 
      FETCH search_cursor INTO status_name, culture_code ; 
      CLOSE search_cursor; 
END; 

Bạn có thể giới thiệu cho tôi cách sử dụng, nếu bạn muốn đề xuất bất kỳ logic nào khác, điều đó thật tuyệt.

+1

tôi cố gắng này: 'VÀ p.plc_status TRÊN (SELECT x *.FROM TABLE (plcListchar) AS x); ' và Oracle tăng ' PLS-00642: loại bộ sưu tập cục bộ không được phép trong câu lệnh SQL ' Tôi cũng đang tìm giải pháp. – Rachcha

Trả lời

21

Giả sử rằng bộ sưu tập của bạn được xác định bằng SQL, không chỉ trong PL/SQL, bạn có thể sử dụng toán tử TABLE (định nghĩa bạn đã đăng không hợp lệ về cú pháp-- bạn cần chỉ định độ dài cho VARCHAR2)

AND p.plc_status IN (SELECT column_value 
         FROM TABLE(plcListchar)) 

Vì tôi không có bảng của bạn, ví dụ bằng cách sử dụng SCOTT schema

SQL> create type ename_tbl is table of varchar2(30); 
    2/

Type created. 

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 l_enames ename_tbl := ename_tbl('KING', 'SMITH'); 
    3 begin 
    4 for i in (select * 
    5    from emp 
    6    where ename in (select column_value 
    7         from table(l_enames))) 
    8 loop 
    9  dbms_output.put_line('ENAME = ' || i.ename); 
10 end loop; 
11* end; 
SQL>/
ENAME = KING 
ENAME = SMITH 

PL/SQL procedure successfully completed. 
+0

Xin chào! Tôi đã thử một cái gì đó tương tự nhưng có một lỗi. Tôi đã đăng câu hỏi: http://stackoverflow.com/questions/15516515/using-nested-table-variables-in-sql-queries-inside-anonymous-blocks-or-stored-pr. Mọi sự trợ giúp sẽ rất được trân trọng. – Rachcha