在Oracle PL / SQL记录中,我们可以使用锚点数据类型(包括%TYPE
和%ROWTYPE
)来定义字段。
当我从查询中填充记录时,在我的select子句中我想要类型转换。是否可以使用Oracle内置函数或其他方法?
在这个示例场景中,我使用简单的解码函数来执行转换:
DECLARE
TYPE TEST_RECORD IS RECORD(
FIRST_NAME EMPLOYEE_MT.FIRST_NAME%TYPE,
LAST_NAME EMPLOYEE_MT.LAST_NAME%TYPE,
MARITIAL_STATUS EMPLOYEE_MT.MARITAL_STATUS%TYPE);
EMPLOYEE_NAME TEST_RECORD;
BEGIN
SELECT EMP.FIRST_NAME,
EMP.LAST_NAME,
DECODE(EMP.MARITAL_STATUS, 1, 'MARRIED', 0, 'UN-MARRIED')
INTO EMPLOYEE_NAME
FROM EMPLOYEE_MT EMP
WHERE EMP.EMPLOYEE_ID = 1;
DBMS_OUTPUT.put_line(EMPLOYEE_NAME.MARITIAL_STATUS);
END;
得到错误:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 9
答案 0 :(得分:0)
您使用与表格列相同的数据类型,使用maritial_status
(不应该是marital_status
?)字段定义了记录类型。来自您显示为数字数据类型的decode
。然后,您尝试将记录的字段值设置为字符串,“结婚”字样为' MARRIED'或者' UN-MARRIED',当该字段期待一个数字时。很明显,这些字符串都不能转换为数字,因此会出现错误。
如果您希望记录存储字符串值,您必须将其定义为 - 显式为字符串,而不是使用%TYPE
:
DECLARE
TYPE TEST_RECORD IS RECORD(
FIRST_NAME EMPLOYEE_MT.FIRST_NAME%TYPE,
LAST_NAME EMPLOYEE_MT.LAST_NAME%TYPE,
MARITAL_STATUS VARCHAR2(10));
...
DBMS_OUTPUT.put_line(EMPLOYEE_NAME.MARITAL_STATUS);
...
您无法使用%TYPE
自动执行此操作,因为数据类型不匹配。您已明确告诉Oracle您希望字段的数据类型为数字,因此Oracle不会让您在该字段中放入字符串。它不是没有内置函数,它只是没有意义。
这也意味着,如果您正在更改数据类型,则无法使用%ROWTYPE
(除非您的修改后的值可以隐式转换回列数据类型)。