Question

J'ai trouvé une chaîne tokenizer requête sur le net et empaqueté dans la fonction ci-dessous, qui renvoient l'ensemble dynamique de jetons. La fonction compile avec succès, mais en quelque sorte je reçois l'erreur « ORA-00933: commande SQL pas correctement pris fin ». Quelqu'un peut-il me aider s'il vous plaît débugger? Merci.

CREATE OR REPLACE TYPE KEY_VALUE_TYPE is object (k varchar2(4000), v varchar2(4000));
CREATE OR REPLACE TYPE KEY_VALUE_TABLE is table of key_value_type;
CREATE OR REPLACE FUNCTION StrTokenizer
        (string IN VARCHAR2, delimiter IN VARCHAR2)
RETURN key_value_table AS
    v_ret key_value_table;
BEGIN
    SELECT
        CAST( 
            multiset(
            SELECT
                LEVEL  k, 
                SUBSTR(STRING_TO_TOKENIZE, 
                    DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1), 
                    INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) 
                        - DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)) v
            FROM
                (
                    SELECT
                        ':string'||':delimiter' AS STRING_TO_TOKENIZE , ':delimiter' AS DELIMITER
                    FROM
                        DUAL
                )
            CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)>0 
            ORDER BY level ASC) 
        As key_value_table)
    INTO
        v_ret
    FROM dual;
    return v_ret;
END;

select * from strtokenizer('a,b,c',',')
ORA-00933: SQL command not properly ended

Edit:

  1. select * from table(strtokenizer('a,b,c',',')) donne "ORA-30732: table ne contient pas de colonnes visibles par l'utilisateur".
  2. ORA-30732 est parti quand je me suis connecté en tant que propriétaire de la fonction, mais la fonction ne peut pas remplacer « : String » || « : delimiter » avec les valeurs transmises dans. Comment puis-je corriger cela? Et comment puis-je exécuter une fonction quand je ne suis pas connecté en tant que son propriétaire? Merci.
Était-ce utile?

La solution

En supposant que la fonction compile, essayez:

SELECT * 
  FROM TABLE(strtokenizer('a,b,c',','));

Référence:

scroll top