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