Oracle 在类型记录中插入记录,并从类型中提取数据

Oracle 在类型记录中插入记录,并从类型中提取数据,oracle,plsql,user-defined-types,Oracle,Plsql,User Defined Types,我想将数据插入类型,并在过程中提取相同的数据。它显示的表视图并不存在,即使我创建了与插入数据时使用的名称相同的类型。请建议 SET SERVEROUTPUT ON; DECLARE FACTORYID VARCHAR2(200); TYPE FACTORY_INFORMATION IS RECORD (FACTORYID VARCHAR2(1000), BILLINGDAY VARCHAR2

我想将数据插入类型,并在过程中提取相同的数据。它显示的表视图并不存在,即使我创建了与插入数据时使用的名称相同的类型。请建议

SET SERVEROUTPUT ON;

DECLARE
FACTORYID       VARCHAR2(200);
TYPE FACTORY_INFORMATION
    IS   RECORD
        (FACTORYID             VARCHAR2(1000),
         BILLINGDAY            VARCHAR2(1000),
         DUE_DAY               VARCHAR2(1000),
         FACTORYNAME           VARCHAR2(1000)
        );

    TYPE TT_FACTORY_INFORMATION   IS TABLE OF FACTORY_INFORMATION INDEX BY BINARY_INTEGER;

    FACTORY_INFO TT_FACTORY_INFORMATION;

BEGIN
INSERT INTO FACTORY_INFO (
SELECT 11,
       25,
       20,
       'xyz'
       FROM dual);
);

SELECT FACTORY_INFO INTO FACTORYID FROM FACTORY_INFO;
DBMS_OUTPUT.PUT_LINE(FACTORYID);
END;
获取以下错误

Error report -
ORA-06550: line 16, column 13:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 16, column 1:
PL/SQL: SQL Statement ignored
ORA-06550: line 23, column 41:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 23, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

工厂信息是PL/SQL变量,不是表。因此,不能将其用作SQL INSERT语句的目标

同样,由于FACTORY_信息是PL/SQL记录类型,您不能在SQL中从中选择(甚至不能使用
table()
函数)。您需要使用PL/SQL收集操作

您可以这样做:

DECLARE
  FACTORYID       VARCHAR2(200);
  TYPE FACTORY_INFORMATION
    IS   RECORD
        (FACTORYID             VARCHAR2(1000),
         BILLINGDAY            VARCHAR2(1000),
         DUE_DAY               VARCHAR2(1000),
         FACTORYNAME           VARCHAR2(1000)
        );

    TYPE TT_FACTORY_INFORMATION   IS TABLE OF FACTORY_INFORMATION INDEX BY BINARY_INTEGER;

    FACTORY_INFO TT_FACTORY_INFORMATION;

BEGIN
  SELECT 11,
         25,
         20,
         'xyz'
  bulk collect into FACTORY_INFO
  FROM dual;

  DBMS_OUTPUT.PUT_LINE(FACTORY_INFO(1).FACTORYID);

END;
/

《Oracle PL/SQL参考》有一整章专门讨论记录和集合,其中有大量关于如何使用它们的示例

工厂信息是PL/SQL变量而不是表。因此,不能将其用作SQL INSERT语句的目标

同样,由于FACTORY_信息是PL/SQL记录类型,您不能在SQL中从中选择(甚至不能使用
table()
函数)。您需要使用PL/SQL收集操作

您可以这样做:

DECLARE
  FACTORYID       VARCHAR2(200);
  TYPE FACTORY_INFORMATION
    IS   RECORD
        (FACTORYID             VARCHAR2(1000),
         BILLINGDAY            VARCHAR2(1000),
         DUE_DAY               VARCHAR2(1000),
         FACTORYNAME           VARCHAR2(1000)
        );

    TYPE TT_FACTORY_INFORMATION   IS TABLE OF FACTORY_INFORMATION INDEX BY BINARY_INTEGER;

    FACTORY_INFO TT_FACTORY_INFORMATION;

BEGIN
  SELECT 11,
         25,
         20,
         'xyz'
  bulk collect into FACTORY_INFO
  FROM dual;

  DBMS_OUTPUT.PUT_LINE(FACTORY_INFO(1).FACTORYID);

END;
/

《Oracle PL/SQL参考》有一整章专门讨论记录和集合,其中有大量关于如何使用它们的示例

读一下上面写的。表不存在,而不是类型。是的,这就是为什么我想知道什么不存在,因为类型名别名带有工厂名称,请阅读它所说的内容。表不存在,而不是类型。是的,这就是为什么我想知道什么是不存在的,因为类型名称别名带有工厂信息。实际上,我的要求是将数据存储在循环中的表中,并希望在循环中的同一个表中记录数据,并希望在每个循环周期中存储新值,所以有没有办法实现这一点。当然有。文档涵盖了该场景。但是,如果您希望答案更关注您的需求,请编辑您的问题,以准确解释您真正想要实现的目标。您想改变我的问题。我已经回答了您提出的问题。但你似乎没有发现这一点有帮助:如果是这样的话,你需要修改你的问题来解释你真正想要达到的目的。实际上,我的要求是在循环表中存储数据,在循环表中记录数据,在每个循环周期中存储新值,那么有没有办法做到这一点。当然有。文档涵盖了该场景。但是,如果您希望答案更关注您的需求,请编辑您的问题,以准确解释您真正想要实现的目标。您想改变我的问题。我已经回答了您提出的问题。但你似乎没有发现这一点有帮助:如果是这样的话,你需要修改你的问题来解释你真正想要达到的目标