I'm trying to make a modification to an existing PL/SQL package I coded some time ago. The original block in question looked like this (which worked fine)
FUNCTION GEN_COLUMN_TYPE ( DTYPE IN VARCHAR2, --DATATYPE OF THE COLUMN
PRCISION IN NUMBER, --PRECISION OF THE COLUMN
SCLE IN NUMBER, --PRECISION OF THE COLUMN
DATA_LENGTH IN NUMBER, --DATA LENGTH OF THE COLUMN
CHAR_LENGTH IN NUMBER, --CHARACTER LENGTH OF THE COLUMN
APP_CODE IN VARCHAR2 -- DATABASE TYPE
)RETURN STRING IS
V_COLUMNTYPE STRING(40) := NULL;
BEGIN
V_COLUMNTYPE := DTYPE;
BEGIN
SELECT TARGET_DATATYPE INTO V_COLUMNTYPE FROM DDL_DATATYPE_MAP DDM
INNER JOIN DDL_SOURCE_APPLICATION DSA ON DDM.TARGET_DBMS=DSA.TARGET_DBMS AND DDM.SOURCE_DBMS=DSA.SOURCE_DBMS
AND DSA.APPLICATION_CODE=APP_CODE
WHERE DDM.SOURCE_DATATYPE=DTYPE;
END;
I have modified it now to look like this. The only change I made was adding the 2 new variables into the definition and the "SELECT INTO" statement so I could use them based on the same join criteria later in the code.
FUNCTION GEN_COLUMN_TYPE ( DTYPE IN VARCHAR2, --DATATYPE OF THE COLUMN
PRCISION IN NUMBER, --PRECISION OF THE COLUMN
SCLE IN NUMBER, --PRECISION OF THE COLUMN
DATA_LENGTH IN NUMBER, --DATA LENGTH OF THE COLUMN
CHAR_LENGTH IN NUMBER, --CHARACTER LENGTH OF THE COLUMN
APP_CODE IN VARCHAR2, --APPLICATION CODE
DBMS_TYPE VARCHAR2, --DATABASE TYPE
VAR_LENGTH_IND VARCHAR2 --WHETHER THE FIELD NEEDS PARENS OR NOT
)RETURN STRING IS
V_COLUMNTYPE VARCHAR2(40) := NULL;
BEGIN
V_COLUMNTYPE := DTYPE;
BEGIN
SELECT TARGET_DATATYPE, SOURCE_DBMS, TARGET_VARIABLE_LEN_IND INTO V_COLUMNTYPE, DBMS_TYPE, VAR_LENGTH_IND FROM DDL_DATATYPE_MAP DDM
INNER JOIN DDL_SOURCE_APPLICATION DSA ON DDM.TARGET_DBMS=DSA.TARGET_DBMS AND DDM.SOURCE_DBMS=DSA.SOURCE_DBMS
AND DSA.APPLICATION_CODE=APP_CODE
WHERE DDM.SOURCE_DATATYPE=DTYPE;
END;
And I'm getting the all-too-common "PL-00382: expression is of wrong type" on the "SELECT ... INTO" statement at the end. All three variables and columns datatypes are varchar2. I've poured over this and can't see anything wrong. What am I missing?
Edit: Sharing this attempt to use local variables and rewrote the naming for more readability. However I am getting an error on "'V_DBMS_TYPE' must be declared"
FUNCTION GEN_COLUMN_TYPE ( P_DTYPE IN VARCHAR2, --DATATYPE OF THE COLUMN
P_PRCISION IN NUMBER, --PRECISION OF THE COLUMN
P_SCLE IN NUMBER, --PRECISION OF THE COLUMN
P_DATA_LENGTH IN NUMBER, --DATA LENGTH OF THE COLUMN
P_CHAR_LENGTH IN NUMBER, --CHARACTER LENGTH OF THE COLUMN
P_APP_CODE IN VARCHAR2
)RETURN STRING IS
V_COLUMNTYPE VARCHAR2(40) := NULL;
BEGIN
V_COLUMNTYPE := P_DTYPE;
DECLARE
V_DBMS_TYPE VARCHAR2(30) := NULL; --DATABASE TYPE
V_VAR_LENGTH_IND VARCHAR2(30) := NULL; --WHETHER THE FIELD NEEDS PARENS OR NOT
BEGIN
SELECT TARGET_DATATYPE, SOURCE_DBMS, TARGET_VARIABLE_LEN_IND INTO V_COLUMNTYPE, V_DBMS_TYPE, V_VAR_LENGTH_IND FROM DDL_DATATYPE_MAP DDM
INNER JOIN DDL_SOURCE_APPLICATION DSA ON DDM.TARGET_DBMS=DSA.TARGET_DBMS AND DDM.SOURCE_DBMS=DSA.SOURCE_DBMS
AND DSA.APPLICATION_CODE=P_APP_CODE
WHERE DDM.SOURCE_DATATYPE=P_DTYPE;