2017-02-01 3 views
0

ich Fragen mit diesem Fehler gesehen habe zu verwenden, aber entweder sind Aufruf externe Geschäfte oder versucht, mit nicht kompatibelen Typen oder einen VARRAY verwenden. Also habe ich ein sehr einfaches Beispiel eingerichtet und trotzdem kann ich es nicht funktionieren lassen.Wie MITGLIED in PLSQL

DECLARE 
TYPE mytype IS TABLE OF VARCHAR2(4) INDEX BY PLS_INTEGER; 
mytable mytype; 
BEGIN 
    mytable((mytable.COUNT+1)) := 'COD1'; 
    mytable((mytable.COUNT+1)) := 'COD2'; 
    mytable((mytable.COUNT+1)) := 'COD3'; 
    mytable((mytable.COUNT+1)) := 'COD4'; 
    --IF 'COD1' MEMBER OF mytable THEN DBMS_OUTPUT.PUT_LINE('We have the code'); END IF; 
    FOR i IN 1..mytable.COUNT LOOP 
    DBMS_OUTPUT.PUT_LINE(mytable(i)); 
    END LOOP; 
END; 

ich dies, wenn ich es laufen:

COD1 
COD2 
COD3 
COD4 

Wenn ich die IF Kommentar- (was ich verwenden will) ich diesen Fehler.

PLS-00306: wrong number or types of arguments in call to MEMBER OF 

Vielleicht benutze ich es nicht richtig oder etwas stimmt nicht.

ich, dass auf einer Schleife zu verwenden, ich versuche, speichere ich die Codes, die ich in der „Matrix“ verwendet haben dann einen Code, den ich brauche gegeben zu wissen, ob es bereits verwendet wurde. Meine ursprüngliche Lösung war, an eine Zeichenfolge wie ".COD1..COD2" anzuhängen. und mach ein einfaches INSTR aber scheint nicht richtig und ich mag Arrays. Ich habe von dieser Funktion (Mitglied von) gehört, die tut, was ich wollte, wenn nur so arbeiten, wie ich es glaube.

können Sie mir sagen, wie richtig zu verwenden, was ich falsch mache oder wie mein Problem in einer besseren Art und Weise zu lösen?

Fast da ... ich es ändern zu

-- Declare 
TYPE mytype IS TABLE OF VARCHAR2(4) INDEX BY VARCHAR(4); 
mytable mytype; 
-- Fill 
mytable('COD1') := 'COD1'; -- kind of redundant I only need the index 
-- The magic 
IF mytable.EXISTS('COD1')... 

Aber ich fühle mich immer noch, dass es einen besseren Weg geben.

Antwort

1

MEMBER OF kann nur mit verschachtelten Tabellen verwendet werden. Sie versuchen, es in einem assoziativen Array zu verwenden. Hier ist eine nette explanation of the differences.

+0

Oh, ich danke, wissen Sie, wie kann ich ein Element in einem assoziativen Array finden, für das Leben von mir habe ich versucht, alles ohne Erfolg zu googeln. –

+0

Sie haben es in Ihrer Bearbeitung oben getan. Verwenden Sie mytable.EXISTS. Vielleicht sollten Sie definieren, was Sie mit "besserer Weg" meinen. – DCookie

+0

Ich meine in der Art, wie ich verstehe Arrays sind so Array [Index] = Wert, so ein "besserer Weg" wäre, den "Wert" nicht den "Index" zu finden, welcher Zweck sollte nicht den Wert selbst speichern. Ich könnte mich irren und wenn es funktioniert ... –

1

Ich habe zu erläutern versucht, wie Sie mit der Member-Funktion mit geschachtelten Tabelle TYPE machen. Es kann nicht mit Asociative-Arrays verwendet werden. Ich hoffe es hilft.

SET serveroutput ON; 
DECLARE 
type my_tab 
IS 
    TABLE OF VARCHAR2(100); 
    tab my_tab; 
BEGIN 
    tab:=my_tab('AVRAJIT','SHUBHOJIT'); 
    IF 'AVRAJIT' member OF (tab) THEN 
    dbms_output.put_line('Yes'); 
    ELSE 
    dbms_output.put_line('No'); 
    END IF; 
END;