我想创建一个复合类型名称 DeptRecord 并接受来自用户的值并将接受的值插入到表中

Posted

技术标签:

【中文标题】我想创建一个复合类型名称 DeptRecord 并接受来自用户的值并将接受的值插入到表中【英文标题】:I want to create a composite types names DeptRecord and accept the values from the user and insert the accepted values into the table 【发布时间】:2021-09-01 10:52:33 【问题描述】:
SET SERVEROUTPUT ON;
DECLARE
  TYPE DEPTRECORD IS RECORD (
    IDEPTNO NUMBER := &deptno,
    SDEPTNAME VARCHAR2(150) := &deptname,
    SDEPTLOC VARCHAR2(150) := &deptloc
  );

  DEP_REC DEPTRECORD;

BEGIN

Insert into department(deptno,deptname,deptloc) values(&deptno,'&deptname','&deptloc');
commit;

END;

【问题讨论】:

您还没有说您遇到了什么问题 - 尽管有一些相当明显的问题。但是为什么要使用 PL/SQL 和记录类型 - 仅运行 insert 似乎就足够了? (假设您使用的客户端可以理解并提示替换变量;您已经标记了两个客户端...) @AlexPoole 是的,我可以直接插入,但我想以我编码的方式进行。你能否让我知道出了什么问题。因为它抛出一个错误。我想接受来自用户的值,并希望将记录插入到部门表(具有 deptno、deptname、deptloc)列中。 请至少在您的问题中包含完整的错误消息。插入本身将接受用户的值 - 这是专门为插入使用记录的分配吗? 是的@AlexPoole。错误就像我所说的 Deptname 为“销售”,因此必须声明其抛出的错误标识符“销售” @AlexPoole 这是问题: 【参考方案1】:

错误就像我所说的 Deptname 为“销售”,因此必须声明其抛出错误标识符“销售”

那是因为你第一次引用deptnamedeptloc 没有被引用;在记录类型定义中:

SDEPTNAME VARCHAR2(150) := &deptname
SDEPTLOC VARCHAR2(150) := &deptloc

应该是

SDEPTNAME VARCHAR2(150) := '&deptname'
SDEPTLOC VARCHAR2(150) := '&deptloc'

正如您在 insert ... values() 子句中所做的那样。

您定义类型的方式是从替换变量中设置默认值;因为这是一个一次性的实例,无论如何它并没有太大的区别,但是您的导师可能希望您使用值而不是默认值填充该类型的 instance

您可能希望使用例如department.deptno%type 来设置记录字段/属性数据类型 - 但这取决于您希望如何执行分配的验证部分。

由于您使用的是& 而不是&&,因此系统会提示您输入两次值。但是您不需要两个引用 - 您可以在插入中引用您的记录:

Insert into department(deptno,deptname,deptloc)
values(dep_rec.ideptno, dep_rec.sdeptname, dep_rec.sdeptloc);

如果记录类型包括表中的所有列,那么您可以一次性插入整个记录,而无需单独引用字段/属性 - 但这里可能不是这种情况。

【讨论】:

以上是关于我想创建一个复合类型名称 DeptRecord 并接受来自用户的值并将接受的值插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

HDF5 中的嵌套复合数据类型

Bigtable 和复合主键

复合类型数组上的 SUM 和 GROUP BY

Julia 中的复合类型:作为命名字段的字典?

如何在 HDF5 C# 上创建复合数据集

在 C# 中创建复合索引