Hi there,

I add one funtion to try to get the number of tokens based on the given delimiter. The funtion is based on Matthew Oldham (m_oldham@yahoo.com)'s function. when I tried to compile it, I got
error. PLS-00306: wrong number or types of arguments in call to
'PUT_LINE'. If I remove the debug line DBMS_OUTPUT.PUT_LINE, the
package can be compiled successfully, but when I call the function
TOKENIZE.GETNUMBER, I get the same error. Below is the code.
tokens.COUNT is a numerical variable, I don't see any place why it does not working.

Your help is very appreciated.

Thanks

solarsys


CREATE OR REPLACE PACKAGE tokenize
/*
/*
|| Author: Matthew Oldham (m_oldham@yahoo.com)
||
|| Date: 11/05/2001
||
|| Overview: This package provides the ability to parse a given character value
|| and break it into tokens based on the given delimiter. The tokens
|| are stored in a PL/SQL table and accessed via a given index. An
|| initial call to TOKENIZE.SETTOKENS must be made to populate the
|| PL/SQL table with the desired string value followed by subsequent
|| calls to TOKENIZE.GETTOKEN to return the desired token value.
|| Example:
|| call TOKENIZE.SETTOKENS('This|is|a|string|','|'); --sets tokens
|| select TOKENIZE.GETTOKEN(1) from dual; -- returns 'This'
|| select TOKENIZE.GETTOKEN(4) from dual; -- returns 'string'
|| select TOKENIZE.GETTOKEN(5) from dual; -- returns NULL
*/
IS
TYPE tokentab IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
PROCEDURE setTokens(p_string VARCHAR2, p_delimiter VARCHAR2);
FUNCTION getToken(p_index PLS_INTEGER) RETURN VARCHAR2;
FUNCTION getNumber(P_NUMBER OUT NUMBER) RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES(getToken,WNDS,WNPS,RNDS);
END tokenize;
/
CREATE OR REPLACE PACKAGE BODY tokenize
IS
tokens tokentab;

PROCEDURE setTokens
(
p_string VARCHAR2,
p_delimiter VARCHAR2
)
IS
v_token VARCHAR2(4000);
v_ctr PLS_INTEGER := 1;
BEGIN
FOR i IN 1..LENGTH(p_string) LOOP
IF SUBSTR(p_string,i,1) = p_delimiter THEN
tokens(v_ctr) := v_token;
v_ctr := v_ctr + 1;
v_token := NULL;
ELSIF i = LENGTH(p_string) THEN
v_token := v_token || SUBSTR(p_string,i,1);
tokens(v_ctr) := v_token;
v_ctr := v_ctr + 1;
v_token := NULL;
ELSE
v_token := v_token || SUBSTR(p_string,i,1);
END IF;
END LOOP;
END setTokens;

FUNCTION getToken
(
p_index PLS_INTEGER
)
RETURN VARCHAR2
IS
BEGIN
IF tokens.EXISTS(p_index) THEN
RETURN tokens(p_index);
ELSE
RETURN NULL;
END IF;
END getToken;

FUNCTION getNumber
(p_number OUT NUMBER)
RETURN NUMBER
IS
V_TOTAL NUMBER;
BEGIN
V_TOTAL:=tokens.COUNT;
DBMS_OUTPUT.PUT_LINE('TOKEN COUNT', V_TOTAL);
return V_TOTAL;
END getNumber;


END tokenize;
/