我想创建一个复合类型名称 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 为“销售”,因此必须声明其抛出错误标识符“销售”
那是因为你第一次引用deptname
和deptloc
没有被引用;在记录类型定义中:
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 并接受来自用户的值并将接受的值插入到表中的主要内容,如果未能解决你的问题,请参考以下文章