【问题标题】:Calling Oracle Associative Array from UPDATE subquery gives PLS-00201 error从 UPDATE 子查询调用 Oracle 关联数组会导致 PLS-00201 错误
【发布时间】:2021-12-11 05:29:20
【问题描述】:

我正在尝试从关联数组中查找值以更新表,但出现错误。这是演示该问题的最低限度代码(我的实际查询要复杂得多)。

我是否遗漏了什么,或者如果这是 Oracle 限制,是否有办法解决?

CREATE TABLE t_employee AS SELECT cast('john' as varchar2(30)) emp_name, CAST (NULL AS NUMBER (5)) emp_id FROM DUAL;
DECLARE
    TYPE emp_typ IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
    emp_lookup   emp_typ;
BEGIN
    emp_lookup ('john') := 1234;
    UPDATE t_employee e
       SET emp_id = (SELECT emp_lookup (e.emp_name) FROM DUAL);
END;
/

--DROP TABLE t_employee;

> PLS-00201:必须声明标识符“E.EMP_NAME”

当我将更新更改为更简单的构造时:

UPDATE t_employee SET emp_id = emp_lookup (t_employee.emp_name);

我觉得奇怪:PLS-00382:表达式类型错误

与 SELECT 相同。在我看来,我们不能直接在 SQL 语句中使用关联数组。

【问题讨论】:

    标签: oracle sql-update associative-array


    【解决方案1】:

    关联数组集合是一种仅限 PL/SQL 的数据类型;不能在 SQL 语句中使用。

    来自Oracle documentation

    表 5-1 PL/SQL:集合类型

    Collection Type Number of Elements Index Type Dense or Sparse Uninitialized Status Where Defined Can Be ADT Attribute Data Type
    Associative array (or index-by table) Unspecified String or PLS_INTEGER Either Empty In PL/SQL block or package No
    VARRAY (variable-size array) Specified Integer Always dense Null In PL/SQL block or package or at schema level Only if defined at schema level
    Nested table Unspecified Integer Starts dense, can become sparse Null In PL/SQL block or package or at schema level Only if defined at schema level

    ...

    关联数组(以前称为PL/SQL 表索引表)是一组键值对。

    ...

    与数据库表不同,关联数组:

    • 不需要磁盘空间或网络操作
    • 无法使用 DML 语句进行操作

    VARRAY 和嵌套表集合可以在 SQL 语句中使用。

    【讨论】:

    • 感谢 MT0 - 那是我试图在文档中找到的,不知何故它让我失望了。啊,浪费了一个上午的时间来让它工作!
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多