代码之家  ›  专栏  ›  技术社区  ›  Omar

创建Oracle过程错误-声明自定义类型

  •  1
  • Omar  · 技术社区  · 13 年前

    我正试图使用web界面在Oracle Express Server(ApplicationExpress 2.1.0.00.39)中创建一个过程。

    这是我通过 SQL Commands web界面中的选项

    CREATE OR REPLACE PROCEDURE my_procedure (listOfNumbers num_list, 
                                              v_value varchar2)
    
    IS
    
      PRAGMA AUTONOMOUS_TRANSACTION;
    
    BEGIN
    
      UPDATE my_table
         SET my_column = v_value
       WHERE my_row_id IN (SELECT column_value 
                             FROM TABLE(listOfNumbers));
    
      COMMIT;
    
    END;
    

    更新:

    改变 SELECT column_value FROM TABLE SELECT column_value FROM TABLE(listOfNumbers) 但现在我得到了以下错误:

    PLS-00201:标识符'num_list'必须 被宣布

    更新2:

    以下是我创建类型的方式:

    CREATE OR REPLACE TYPE  "num_list" as table of NUMBER(38,1)
    /
    

    似乎错误是由参数声明行引起的:

    (listOfNumbers num_list, v_value varchar2)
    

    下面是Oracle数据库速成版web界面显示的对象详细信息。

    alt text

    3 回复  |  直到 13 年前
        1
  •  2
  •   Dave Costa    13 年前

    尝试。。。 TABLE(CAST(listOfNumbers AS num_list)) .

    SQL解析器只看到一个绑定占位符来代替 listOfNumbers ,因为它是自定义类型,所以需要告诉它它是什么类型。

    只有当 num_list 已在架构中定义为类型,而不仅仅是在PL/SQL块中声明为类型。

        2
  •  0
  •   APC    13 年前

    如果数组类型已正确声明(见下文),则代码可以工作。因为你还有问题,我想这就是你的错误所在。但是您需要发布用于创建NUM_列表类型的代码,以便我们更正它。

    我的测试数据:

    SQL> select * from my_table
      2  /
    
    MY_COLUMN             MY_ROW_ID
    -------------------- ----------
    APC                           1
    XYZ                           2
    JFK                           3
    
    SQL>
    

    要在SQL语句中使用类型,必须将其创建为SQL对象:

    SQL> create type num_list as table of number;
      2  /
    
    Type created.
    
    SQL>
    SQL>
    SQL> create or replace procedure my_procedure
      2      (listofnumbers num_list,
      3                    v_value varchar2)
      4  is
      5  begin
      6
      7    update my_table
      8       set my_column = v_value
      9     where my_row_id in (select column_value
     10                           from table(listofnumbers));
     11
     12  end;
     13  /
    
    Procedure created.
    
    SQL>
    

    执行程序:

    SQL> declare
      2    n num_list := num_list(1,3);
      3  begin
      4    my_procedure (n , 'FOX IN SOCKS');
      5  end;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    瞧!

    SQL> select * from my_table
      2  /
    
    MY_COLUMN             MY_ROW_ID
    -------------------- ----------
    FOX IN SOCKS                  1
    XYZ                           2
    FOX IN SOCKS                  3
    
    SQL>  
    
        3
  •  0
  •   Omar    13 年前

    很明显我是在用引号在名字周围创建类型的:

    以下 不起作用 :

    CREATE OR REPLACE TYPE  "NUMBER_T" as table of NUMBER(38,1)
    

    当我在没有引号的情况下做了这件事,然后创建了这个过程,它就能够识别出来。

    以下 干得不错 :

    CREATE OR REPLACE TYPE  NUMBER_T as table of NUMBER(38,1)
    

    我不知道为什么,但成功了。