pl/SQL中的SQL类型,类型为表

pl/SQL中的SQL类型,类型为表,sql,object,plsql,user-defined-types,Sql,Object,Plsql,User Defined Types,我对将类型创建为表有点困惑 这条线是干什么的 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_O

我对将类型创建为表有点困惑

这条线是干什么的

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;
这就是我现在使用它的方式,我看到人们使用以下语句:

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;

有人能给我解释一下吗?

在你的例子中,
OBJECT\u ONE
是单个对象,而
OBJECT\u ONE\u 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>
我建议你读一些关于收藏的东西,有很多东西要学

这一行在Pl/sql中做什么

CREATE OR REPLACE TYPE OBJECT_ONE_TABLE AS TABLE OF OBJECT_ONE;
这一行表示您已经为新定义的对象数据类型创建了一个用户定义的类型,该类型假定保存数据,如
。所以,当您在代码中编写这一行时,
PLSQL
编译器知道您已经定义了一个新的用户定义表集合,它应该像普通表一样保存记录

现在,您可能会想到下面的用法:

现在,当您声明此类型时,意味着您创建了新的用户定义数据类型的结构。它类似于
C++
structures,您可以在其中创建一个将不同数据类型组合在一起的结构,将其用作自己的数据类型

现在,如果我看一下您的对象定义和下面发布的代码,我得到的第一印象是
失败
。对象有
2列
列,在为变量赋值时,尝试传递
3列
变量。因此,这将导致失败,说“PLS-00306:调用‘OBJECT_ONE’时参数的数量或类型错误”

更正代码后,您可以看到,在这里您声明了对象类型的单个变量并为其赋值,这通常没有得到广泛使用,因为您无法多次为同一个变量赋值以容纳多行。因此,如果任务是将多组行分配给变量,则需要如下所示的语句

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.
因此,如果希望在用户定义的表中插入大量行,则必须添加如下所示的下一步:

创建或替换类型OBJECT\u ONE\u TABLE作为OBJECT\u ONE的TABLE

以及您得到的输出:

SQL> /
MIKIA 25
SEROW 26
THIRD 27

PL/SQL procedure successfully completed.
SQL> /
MIKIA 25
SEROW 26
THIRD 27

PL/SQL procedure successfully completed.