我对作为表格的类型的创建感到困惑。
这条线做什么?
CREATE OR REPLACE TYPE OBJECT_ONE_TABLE AS TABLE OF OBJECT_ONE;
以下是我使用类型作为示例的方法:
CREATE OR REPLACE TYPE OBJECT_ONE AS OBJECT(
NAME VARCHAR2(5 BYTE),
AGE VARCHAR2 (50 BYTE)
);
然后运行声明:
DECLARE
COPY_OBJECT OBJECT_ONE;
BEGIN
COPY_OBJECT := OBJECT_ONE ('kgo','MONDAY','25')
DBMS_OUTPUT.PUT_LINE(COPY_OBJECT.NAME ||' ' || COPY_OBJECT.WEEK ||
COPY_OBJECT.AGE);
end;
这就是我现在使用它的方式,我看到人们使用以下语句:
CREATE OR REPLACE TYPE OBJECT_ONE_TABLE AS TABLE OF OBJECT_ONE;
有人可以向我解释一下吗?
答案 0 :(得分:1)
这行在Pl / sql中做了什么?
CREATE OR REPLACE TYPE OBJECT_ONE_TABLE AS TABLE OF OBJECT_ONE;
此行声明您已创建新定义的Object数据类型的用户定义类型,该类型假定包含table
之类的数据。因此,当您在代码中编写此行时,PLSQL
编译器知道您已定义了一个新的用户定义表集合,该集合假设像普通表一样保存记录。
现在您将考虑使用以下内容:
CREATE OR REPLACE TYPE OBJECT_ONE AS OBJECT( NAME VARCHAR2(5 BYTE), AGE VARCHAR2 (50 BYTE) );
现在,当您声明此类型时,这意味着您创建了新的userdefined数据类型的结构。它类似于C++
结构,您可以在其中创建具有不同数据类型的结构,将其用作您自己的数据类型。
现在,如果我查看您的对象定义和下面发布的代码,那么我得到的第一印象是Failure
。您的对象具有2
列,并且在为您的变量赋值时,尝试传递3
个变量。所以这会导致说"PLS-00306: wrong number or types of arguments in call to 'OBJECT_ONE'"
DECLARE COPY_OBJECT OBJECT_ONE; BEGIN COPY_OBJECT := OBJECT_ONE ('MIKIA','MONDAY','25') DBMS_OUTPUT.PUT_LINE(COPY_OBJECT.NAME ||' ' || COPY_OBJECT.WEEK || COPY_OBJECT.AGE); end;
更正你的代码,你可以看到你在这里声明了一个Object类型的变量并为其赋值,这通常没有被广泛使用,因为你不能分配多次相同的变量来保存多行。因此,如果任务是将多组行分配给变量,那么您将需要下面显示的语句。
SQL> DECLARE
2 COPY_OBJECT OBJECT_ONE;
3 BEGIN
4 COPY_OBJECT := OBJECT_ONE ('MIKIA', '25');
5 DBMS_OUTPUT.PUT_LINE ( COPY_OBJECT.NAME || ' ' || COPY_OBJECT.AGE);
6 END;
7 /
MIKIA 25
PL/SQL procedure successfully completed.
所以在这里你想要在你的用户定义表中插入一些行,你必须添加下面显示的下一步:
CREATE OR REPLACE TYPE OBJECT_ONE_TABLE AS TABLE OF OBJECT_ONE;
DECLARE
--Defining and initializing
COPY_OBJECT OBJECT_ONE_TABLE :=OBJECT_ONE_TABLE ();
BEGIN
---Exteding(3) means i state the collection to hold 3 records. I
--if you dont define then there would not be any limit of records which a collection can hold
COPY_OBJECT.Extend(3);
--Adding rows to your userdefined table
COPY_OBJECT(1) := OBJECT_ONE ('MIKIA', '25');---First row of the collection table
COPY_OBJECT(2) := OBJECT_ONE ('SEROW', '26');---Second row of the collection table
COPY_OBJECT(3) := OBJECT_ONE ('THIRD','27');---Third row of the collection table
FOR I in 1..COPY_OBJECT.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE ( COPY_OBJECT(i).NAME || ' ' || COPY_OBJECT(i).AGE);
END LOOP;
END;
输出你得到:
SQL> /
MIKIA 25
SEROW 26
THIRD 27
PL/SQL procedure successfully completed.
答案 1 :(得分:0)
在您的示例中,OBJECT_ONE_TABLE
是单个对象,而SQL> CREATE OR REPLACE TYPE OBJECT_ONE AS OBJECT(
2 NAME VARCHAR2(5 BYTE),
3 WEEK VARCHAR2(10 BYTE),
4 AGE VARCHAR2 (50 BYTE)
5 );
6 /
Type created.
SQL> CREATE OR REPLACE TYPE OBJECT_ONE_TABLE AS TABLE OF OBJECT_ONE;
2 /
Type created.
是一组对象。
例如:
SQL> DECLARE
2 COPY_OBJECT OBJECT_ONE;
3 BEGIN
4 COPY_OBJECT := OBJECT_ONE ('MIKIA','MONDAY','25');
5 DBMS_OUTPUT.PUT_LINE(COPY_OBJECT.NAME ||' ' || COPY_OBJECT.WEEK || COPY_OBJECT.AGE);
6 end;
7 /
MIKIA MONDAY25
PL/SQL procedure successfully completed.
单个对象:
SQL> DECLARE
2 COPY_OBJECT OBJECT_ONE;
3 tab OBJECT_ONE_TABLE := OBJECT_ONE_TABLE();
4 BEGIN
5 tab.extend(2);
6 COPY_OBJECT := OBJECT_ONE ('MIKIA','MONDAY','25');
7 tab(1) := COPY_OBJECT;
8 --
9 COPY_OBJECT := OBJECT_ONE ('XXX','SUNDAY','33');
10 tab(2) := COPY_OBJECT;
11 --
12 FOR I IN TAB.FIRST .. TAB.LAST LOOP
13 DBMS_OUTPUT.PUT_LINE(i || ' - ' || tab(i).NAME ||' ' || tab(i).WEEK || ' ' || tab(i).AGE);
14 END LOOP;
15 end;
16 /
1 - MIKIA MONDAY 25
2 - XXX SUNDAY 33
PL/SQL procedure successfully completed.
SQL>
集合:
{{1}}
我建议您阅读有关收藏的内容,我们需要学习很多东西。