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

在PL/SQL中,如何用同义词name初始化表类型的值

  •  -1
  • user2488578  · 技术社区  · 6 年前

    我想初始化 MY_PERSON_TABLE 表中的列 FN_INITIALIZE 作用

    下面是代码。这个问题可以看作是 this question

    我面临的问题是,我无法编译代码并为FNAME,ID分配一些值。

    create table MY_PERSON_TABLE
    (
    ID NUMBER(20),
    FNAME VARCHAR2(30)
    );
    
    CREATE SYNONYM SYNONYM_PERSONAL FOR MY_PERSON_TABLE;
    
    CREATE OR REPLACE PACKAGE TEST IS
    
    TYPE TY_PERSONAL IS TABLE OF SYNONYM_PERSONAL%ROWTYPE INDEX BY BINARY_INTEGER;
    
    TYPE TY_PERSON IS RECORD(
    PERSONAL TY_PERSONAL
    );
    
    END TEST;
    
    CREATE OR REPLACE PACKAGE TEST_BODY IS
    
    FUNCTION FN_INITIALIZE(P_ACTION IN VARCHAR2) RETURN BOOLEAN IS
    L_TO_INITIALIZE TY_PERSON;
    
    BEGIN
    L_TO_INITIALIZE.PERSONAL := NEW SYNONYM_PERSONAL();
    --The above code throws "PLS-00222: no function with name .. exists in the scope"
    --How to initialiaze the value of FNAME & ID of MY_PERSON_TABLE?
    
    END FN_INITIALIZE;
    
    END TEST_BODY;
    BEGIN
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   MT0    6 年前

    您有几个错误:

    • CREATE OR REPLACE PACKAGE TEST_BODY 应该是 CREATE OR REPLACE PACKAGE BODY TEST (和 END TEST_BODY 也应该是 END TEST )。
    • 您不需要初始化记录;它们是自动创建的,字段初始化为 NULL 。这是需要初始化的对象。
    • L_TO_INITIALIZE.PERSONAL := NEW SYNONYM_PERSONAL(); 没有意义,因为 SYNONYM_PERSONAL 是表的同义词,而不是记录的同义词。相反,您只需要选择任何索引值( 23 例如),只需设置记录的字段值,而无需对其进行初始化。

    像这样:

    SQL FIDDLE

    CREATE OR REPLACE PACKAGE BODY TEST IS
    
      FUNCTION FN_INITIALIZE(P_ACTION IN VARCHAR2) RETURN BOOLEAN
      IS
        L_TO_INITIALIZE TY_PERSON;
      BEGIN
        L_TO_INITIALIZE.PERSONAL(23).FNAME := 'A';
        L_TO_INITIALIZE.PERSONAL(23).ID    := 1;
        RETURN TRUE;
      END FN_INITIALIZE;
    END TEST;
    /
    

    然而,你应该问问自己:

    • 为什么要使用PL/SQL关联数组?如果要使用连续索引,那么可能应该使用集合。
    • 您将如何处理阵列?您没有从函数返回它。