在 PL/SQL 中如何使用同义词名称初始化 Table 类型的值

In PL/SQL how to initialiaze the value of Table type with Synonym name

我想在 FN_INITIALIZE 函数中初始化 MY_PERSON_TABLE table 列的值。

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

的延伸

我面临的问题是,我无法编译代码并为 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

您有几个错误:

  • CREATE OR REPLACE PACKAGE TEST_BODY 应该是 CREATE OR REPLACE PACKAGE BODY TESTEND TEST_BODY 也应该是 END TEST)。
  • 您不需要初始化记录;它们是自动创建的,字段初始化为 NULL。这是您需要初始化的对象。
  • L_TO_INITIALIZE.PERSONAL := NEW SYNONYM_PERSONAL(); 没有意义,因为 SYNONYM_PERSONAL 是 table 而不是记录的同义词。相反,您只想选择任何索引值(例如 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 关联数组?如果您打算使用连续索引,那么您可能应该使用一个集合。
  • 你打算用数组做什么?您没有从函数中返回它。