Recently we had the need to pull user profile information independent of the Microsoft provider framework. The property values are stored in a table that contains a "PropertyNames" field with meta information on the start position and length of the property value being stored.
This self-describing storage method is pretty slick but attempting to use the built in wrapped function for retrieving the property values proved to be more challenging than simply writing our own parser.
There are two SQL functions. They are used in this way:
Here are the functions:
There are two SQL functions. They are used in this way:
SELECT p.USERID, m.EMAIL,
GETPROFILEELEMENT('FirstName', PropertyNames, PropertyValuesString) AS FirstName,
GETPROFILEELEMENT('LastName', PropertyNames, PropertyValuesString) AS LastName
FROM ora_aspnet_profile p, ora_aspnet_membership m
WHERE p.USERID = m.USERID
Here are the functions:
CREATE OR REPLACE FUNCTION ASPNET_DB_USER."GETPROFILEELEMENT"
(
fieldName IN VARCHAR2,
fields IN NCLOB,
valuess IN NCLOB)
RETURN VARCHAR2
AS
fieldNameToken VARCHAR2(1000);
fieldNameStart INT;
valueStart INT;
valueLength INT;
BEGIN
IF fieldName IS NULL
OR LENGTH(fieldName) = 0
OR fields IS NULL
OR LENGTH(fields) = 0
OR valuess IS NULL
OR LENGTH(valuess) = 0
THEN
RETURN NULL;
ELSE
fieldNameStart := INSTR(fields,fieldName || ':S',1);
END
IF;
IF fieldNameStart = 0
THEN
RETURN NULL;
ELSE
fieldNameStart := fieldNameStart + LENGTH(fieldName) + 3;
fieldNameToken := SUBSTR(Fields,fieldNameStart,LENGTH(Fields)-fieldNameStart);
valueStart := getelement(1,fieldNameToken,':');
valueLength := getelement(2,fieldNameToken,':');
END
IF;
IF valueLength = 0
THEN
RETURN '';
END
IF;
RETURN SUBSTR(valuess, valueStart+1, valueLength);
END GETPROFILEELEMENT;
CREATE OR REPLACE FUNCTION ASPNET_DB_USER."GETELEMENT"
(
ord IN INT,
STR IN VARCHAR2,
delim IN VARCHAR2)
RETURN INT
IS
pos INT;
curord INT;
BEGIN
IF STR IS NULL
OR LENGTH(STR) = 0
OR ord IS NULL
OR ord < 1
OR ord > LENGTH(STR) - LENGTH(REPLACE(STR, delim, '')) + 1
THEN
RETURN NULL;
END
IF;
pos := 1;
curord := 1;
WHILE curord < ord
LOOP
pos := INSTR(STR,delim,pos)+1;
curord := curord + 1;
END LOOP;
RETURN TO_NUMBER(SUBSTR(STR, pos, INSTR(STR || delim,delim,pos) - pos));
END GetElement;

Comments
Post a Comment