2013-03-20 14 views
14

Przekazuję tablicę ciągów (plcListchar) do procedury składowanej, chciałbym użyć tej tablicy łańcuchów w klauzuli IN().Tablica w klauzuli IN() Oracle PLSQL

Nie mogę użyć plcListchar bezpośrednio w klauzuli IN(). Pozwól mi pokazać, w jaki sposób jestem crating tablica ciągów plcListchar w 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); 

na skrzynie CHAR_ARRAY,

create or replace type CHAR_ARRAY as table of varchar2; 

chcę używać plcListchar w klauzuli. Oto moja procedura przechowywana.

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; 

Czy mógłbyś zasugerować mi, jak używać, jeśli chcesz zasugerować jakąkolwiek inną logikę, to jest świetne.

+1

SCOTT próbowałem to: 'I p.plc_status IN (SELECT X *.od stołu (plcListchar) jako X); ' i Oracle podnosi ' PLS-00642: lokalne typy kolekcja nie jest dozwolony w SQL statements' Ja również poszukuje rozwiązania. – Rachcha

Odpowiedz

21

Zakładając, że zbiór jest zdefiniowany w SQL, nie tylko w PL/SQL, można użyć operatora TABLE (definicja ty pisał nie jest składniowo valid-- trzeba by określić długość dla VARCHAR2)

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

Ponieważ nie mam tabele, przykład za pomocą schematu

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

Cześć! Próbowałem czegoś podobnego, ale dostałem błąd. Napisałem pytanie: http://stackoverflow.com/questions/15516515/using-nested-table-variables-in-sql-queries-inside-anonymous-blocks-or-stored-pr. Każda pomoc będzie bardzo ceniona. – Rachcha

Powiązane problemy