【问题标题】:ORA-00904: "PREV_VAL_R": invalid identifierORA-00904: "PREV_VAL_R": 无效标识符
【发布时间】:2022-01-22 18:57:18
【问题描述】:

我正在尝试将值批量收集到集合中。我收到ORA-00904: "PREV_VAL_R" invalid identifier。代码被简化了。

PROCEDURE MY_HELPER() IS
----------------------------------------------------------------
    TYPE PREV_VAL_R IS RECORD( 
            DESC1     VARCHAR2(250), 
            MONTH_VAL VARCHAR2(250),
            MONTH_ALL VARCHAR2(250));
    TYPE PREV_VAL_T IS TABLE OF  PREV_VAL_R;   
                
BEGIN
    SELECT PREV_VAL_R(DESC1, MONTH_VAL, MONTH_ALL)
    BULK COLLECT INTO PREV_VAL_T
    FROM MY_TABLE;
END MY_HELPER;

我做错了什么? 谢谢!

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您将 PREV_VAL_R() 作为对象构造函数调用,但这是一种 PL/SQL 记录类型,不是 SQL 级别的已知类型。

    您可以将列直接批量收集到您的记录表中​​;虽然它需要是该集合类型的 instance,而不是类型本身,例如:

        PROCEDURE MY_HELPER() IS
        -------------------------------------------------------------------------------------------------------------------------------------------------------------------
        TYPE PREV_VAL_R IS RECORD( 
                DESC1     VARCHAR2(250), 
                MONTH_VAL VARCHAR2(250),
                MONTH_ALL VARCHAR(250));
        TYPE PREV_VAL_T IS TABLE OF  PREV_VAL_R; 
        L_PREV_VAL_T PREV_VAL_T;
                    
        BEGIN
            SELECT DESC1, MONTH_VAL, MONTH_ALL
            BULK COLLECT INTO L_PREV_VAL_T
            FROM MY_TABLE;
        END MY_HELPER;
    

    我添加了L_PREV_VAL_T PREV_VAL_T; 来声明集合的实例,并添加了INTO PREV_VAL_TINTO L_PREV_VAL_T 来定位该实例。 (当然,您可以/应该使用更有意义的名称...)

    db<>fiddle

    【讨论】:

      【解决方案2】:

      类型prev_val_r 是普通的旧PL/SQL 记录类型,而不是具有构造函数的对象类型。您可以只列出项目,而无需任何构造函数。

      另外,prev_val_t 是一种类型,因此您仍然需要该类型的变量。在下面的示例中,我将我的 t 命名为:

      create or replace procedure my_helper
      as
          type prev_val_r is record(
               desc1     varchar2(250)
              ,month_val varchar2(250)
              ,month_all varchar2(250));
      
          type prev_val_t is table of prev_val_r;
          
          t prev_val_t;
      begin
          select 'x', 'y', 'z' bulk collect into t from dual;
      end my_helper;
      

      21c 的 PL/SQL 记录类型的Qualified Expressions 类似于对象构造函数,因此您可以编写示例

      r prev_val_r := prev_val_r('x', 'y', 'z');
      

      但它们仅用于 PL/SQL 而不是 SQL。据推测,PL/SQL 编译器会在内部为您构建代码,所以它只是 syntactic sugar,这就是 Oracle 小心避免将其称为构造函数的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2011-08-27
        • 2011-04-21
        • 2019-06-29
        • 2013-10-20
        • 2017-12-29
        • 2015-07-25
        相关资源
        最近更新 更多