【问题标题】:RECORD TYPE too many values error in Oracle 10gOracle 10g 中的 RECORD TYPE too many values 错误
【发布时间】:2013-06-16 09:47:09
【问题描述】:

下面是我emp表的结构:

Name                 Null?    Type
------------------ -------- ------------
EMP_ID             NOT NULL NUMBER
EMP_NAME                    VARCHAR2(20)
DEPT_ID                     NUMBER
AGE                         NUMBER
SEX                         VARCHAR2(5)

如果我使用下面的 RECORD TYPE 定义,那么它可以工作:

declare
type rec_emp is record(empid emp.emp_id%TYPE, empname emp.emp_name%type, empdept emp.dept_id%type, empage emp.age%type, empsex emp.sex%type);
v_emprecord rec_emp;
begin
v_emprecord.empid := 11;
v_emprecord.empname := 'Alen';
v_emprecord.empdept := 2;
v_emprecord.empage := 27;
v_emprecord.empsex := 'M';
update emp set ROW = v_emprecord where emp_id = 11;
dbms_output.put_line('Rows Updated: ' || sql%rowcount);
end;

但同样,如果我尝试此代码,则它不起作用(这里我减少了 RECORD TYPE 变量中的列数):

declare
type rec_emp is record(empname emp.emp_name%type, empdept emp.dept_id%type);
v_emprecord rec_emp;
begin
v_emprecord.empname := 'Alen';
v_emprecord.empdept := 2;
update emp set ROW = v_emprecord where emp_id = 11;
dbms_output.put_line('Rows Updated: ' || sql%rowcount);
end;

错误是:PL/SQL: ORA-00913: too many values

就我而言,我不需要在RECORD TYPE 上声明所有列,因此尝试减少RECORD TYPE 声明中的列数。这种行为有什么具体原因吗?

【问题讨论】:

    标签: sql database oracle plsql oracle10g


    【解决方案1】:

    您不能使用记录更新具有 ROW 关键字的实际行。

    来自docs

    使用 PL/SQL 记录值更新数据库

    UPDATE 语句的仅 PL/SQL 扩展允许您更新 使用 RECORD 或 %ROWTYPE 类型的单个变量的数据库行 SET 子句的右侧,而不是字段列表。

    【讨论】:

      【解决方案2】:

      不能期望 Oracle 知道您在记录类型中遗漏了哪些列,因此它也无法知道映射记录字段的表列。

      您可能认为它应该能够解决,因为您在记录定义中使用了%type。但这只是使这成为更一般构造中的一种特殊情况。您可以使用显式类型,例如varchar2number,或不同的源表,例如dept.dept_id%type,它仍然可以在所有列都“映射”的第一个实例中工作;但在第二种情况下,不可能知道列与字段的关系。

      Oracle 可能可能猜测或假设您在某些情况下的意图,但这意味着它必须做更多的工作,行为会有所不同在不同的情况下,也许更重要的是依赖这些假设可能意味着它最终没有真正按照你的意思做,这对你的代码来说是危险的。

      如果您真的想使用ROW 选项,您也可以声明其他字段,但使用 null 或其他默认值;但这会用您的默认值覆盖任何现有的列值,这可能不是您想要的。或者选择现有值到您的记录中。否则,您必须在update 中单独指定列,这会更正常。我不知道你为什么要在这里使用记录,而不是简单的update 直接设置你关心的两列:

      update emp
      set empname = 'Alen', empdept = 2
      where empid = 11;
      

      【讨论】:

      • 感谢您的解释...我正在尝试使用ROW 的简单示例,否则您是正确的,该场景不需要使用ROW
      猜你喜欢
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多