2017-02-08 2 views
2

Verwenden von Oracle 12c, habe ich folgende PL/SQL-PaketWie kann der Indextyp eines assoziativen Oracle 12c-Arrays aus den Wörterbuchansichten ermittelt werden?

CREATE OR REPLACE PACKAGE x AS 
    TYPE t IS TABLE OF NUMBER INDEX BY PLS_INTEGER; 
    FUNCTION f RETURN t; 
END x; 
/

ich jetzt dynamisch möchte f den Rückgabetyp der obigen Funktion entdecken:

SELECT * 
FROM all_arguments 
WHERE package_name = 'X'; 

Diese Abfrage liefert entlang der etwas Linien

enter image description here

..., die zu einem nützlichen analysiert werden kann Datenstruktur, die eine ausgefallene rekursive Abfrage verwendet, nur für den Fall, dass die Tabelle Datensätze enthält, nicht Nummern (z. wie the one in this article for PL/SQL RECORD).

Was ich in den Wörterbuchansichten jedoch nicht finden konnte, ist ein formeller Verweis auf den Indextyp des assoziativen Arrays, d. H. PLS_INTEGER. Gibt es eine Möglichkeit, das in einer anderen Sichtweise zu entdecken?

Hinweis, ich möchte vermeiden, den Inhalt von ALL_IDENTIFIERS zu analysieren, da ich nicht auf PLSCOPE_SETTINGS='IDENTIFIERS:ALL' auf beliebigen Zielsystemen verlassen kann.

Antwort

1

Bitte verzeiht mir denn ich habe gesündigt:

WITH 
    FUNCTION index_type(type_owner VARCHAR2, type_name VARCHAR2, type_subname VARCHAR2) 
    RETURN VARCHAR2 IS 
    l_result VARCHAR2(50) := 'UNKNOWN'; 
    BEGIN 
    EXECUTE IMMEDIATE q'[ 
     DECLARE 
     l_result VARCHAR(50); 
     v "]' || type_owner || '"."' || type_name || '"."' || type_subname || q'["; 
     BEGIN 
     BEGIN 
      v('A') := NULL; 
      l_result := 'VARCHAR2'; 
     EXCEPTION 
      WHEN OTHERS THEN 
      BEGIN 
       v(1) := NULL; 
       l_result := 'PLS_INTEGER'; 
      EXCEPTION 
       WHEN OTHERS THEN l_result := 'UNKNOWN'; 
      END; 
     END; 

     :result := l_result; 
     END;]' USING OUT l_result; 

    RETURN l_result; 
    EXCEPTION 
    WHEN OTHERS THEN RETURN SQLERRM; 
    END index_type; 
SELECT 
    type_owner, type_name, type_subname, 
    index_type(type_owner, type_name, type_subname) AS index_type 
FROM all_arguments 
WHERE data_type = 'PL/SQL TABLE'; 

, die das gewünschte Ergebnis liefert:

enter image description here

Natürlich ist die Typdefinition mehr Details verdient, einschließlich der Länge, Präzision, usw. , aber das ist gut genug für mich.

Verwandte Themen