This may be a bad use case for what I am trying to accomplish, but I have read dozens of pages and I cannot figure out if this is possible in Oracle or not.
I would like to do something similar to another stackoverflow question: How to bind calls in an object of type pl / sql returning CAM
In my code, I have a type called parseName with a constructor function and 3-member functions: getFirstName, getMiddleName, getLastName. I would like to have a fourth member function: cleanString, which removes all characters not between AZ or az.
Call examples:
SELECT parseName('John123 Doe').getFirstName().cleanString()
FROM dual;
SELECT parseName('John123 Doe').getFirstName()
FROM dual;
Here is the type I wrote so far.
CREATE OR REPLACE TYPE parseName AS OBJECT
(
g_name VARCHAR2(255),
g_parts NUMBER,
g_first_name VARCHAR2(255),
g_middle_name VARCHAR2(1),
g_last_name VARCHAR2(255),
CONSTRUCTOR FUNCTION parseName
(p_name IN VARCHAR2)
RETURN self AS result,
MEMBER FUNCTION getFirstName RETURN VARCHAR2,
MEMBER FUNCTION getMiddleName RETURN VARCHAR2,
MEMBER FUNCTION getLastName RETURN VARCHAR2
);
/
SHOW ERRORS
/
CREATE OR REPLACE TYPE BODY parseName IS
CONSTRUCTOR FUNCTION parseName
(p_name IN VARCHAR2)
RETURN self AS result
IS
v_name VARCHAR2(255);
v_length NUMBER;
v_parts NUMBER;
v_instr NUMBER;
BEGIN
v_name := TRIM(p_name);
IF v_name IS NULL THEN
self.g_first_name := 'Unknown';
self.g_middle_name := ' ';
self.g_last_name := 'Unknown';
RETURN;
END IF;
self.g_name := v_name;
RETURN;
END;
MEMBER FUNCTION getFirstName
RETURN VARCHAR2
IS
v_parts NUMBER;
BEGIN
IF self.g_first_name IS NOT NULL THEN
RETURN self.g_first_name;
END IF;
v_parts := LENGTH(self.g_name) - LENGTH(REPLACE(self.g_name,' ',''));
IF v_parts = 0 THEN
RETURN self.g_name;
ELSE
RETURN TRIM(SUBSTR(self.g_name,1, INSTR(self.g_name,' ',1) ));
END IF;
END getFirstName;
MEMBER FUNCTION getMiddleName
RETURN VARCHAR2
IS
v_parts NUMBER;
v_instr2 NUMBER;
v_instr1 NUMBER;
BEGIN
IF self.g_middle_name IS NOT NULL THEN
RETURN NULL;
END IF;
v_parts := LENGTH(self.g_name) - LENGTH(REPLACE(self.g_name,' ',''));
IF v_parts = 0 THEN
RETURN NULL;
ELSIF v_parts = 1 THEN
RETURN NULL;
ELSE
v_instr2 := INSTR(self.g_name,' ',1,2);
v_instr1 := INSTR(self.g_name,' ',1,1);
RETURN TRIM( SUBSTR(self.g_name, v_instr1, (v_instr2-v_instr1) ));
END IF;
END getMiddleName;
MEMBER FUNCTION getLastName
RETURN VARCHAR2
IS
v_parts NUMBER;
BEGIN
IF self.g_last_name IS NOT NULL THEN
RETURN self.g_last_name;
END IF;
v_parts := LENGTH(self.g_name) - LENGTH(REPLACE(self.g_name,' ',''));
IF v_parts = 0 THEN
RETURN 'Unknown';
ELSIF v_parts = 1 THEN
RETURN TRIM( SUBSTR(self.g_name, INSTR(self.g_name,' ',1,1), LENGTH(self.g_name)) );
ELSE
RETURN TRIM( SUBSTR(self.g_name, INSTR(self.g_name,' ',1,2), LENGTH(self.g_name)) );
END IF;
END getLastName;
END;
/
SHOW ERRORS
/
.
Thanks for any advice you can provide.