pl / sql中的SQL TYPE并键入为表

时间:2018-01-25 20:42:41

标签: 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_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;

有人可以向我解释一下吗?

2 个答案:

答案 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}}

我建议您阅读有关收藏的内容,我们需要学习很多东西。