Oracle用户定义的记录

时间:2017-11-22 11:47:49

标签: oracle plsql

在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

1 个答案:

答案 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(除非您的修改后的值可以隐式转换回列数据类型)。