2

所以我创建了一个名为“exam”的表,其中包含“Name”、“Rollno”和“Result P/F”三列。我希望它执行以下操作:

输入名称时(通过'&name'语法),它会自动为名字分配卷号(Rollno)1501,然后询问您的结果,您只能输入“P”或“F”,分别代表通过或失败。当您输入下一个名称时,它会将 Rollno 增加到 1502.. 等等。

关于 Rollno 部分,我有一个名为 EXAMSQN 的序列。看起来像: 第一个

关于“结果 P/F”部分,我有一个检查约束。这就是我向表中插入值的方式:

insert into exam (name, rollno, "Result P/F")
values ('&name', examsqn.nextval, '&Result P/F')

顺便说一句,这就是我的检查约束的方式:

1  alter table exam
2* add constraint exam_result_ck check ("Result P/F" in ('P','F'))

所以我对此的期望是,当它要求结果时,它只需要一个 P 或一个 F

我被要求提供名称和结果,但在那之后我得到了一个错误。整个过程是这样的:

Enter value for name: nikh
Enter value for result: P
old   2: values ('&name', examsqn.nextval, '&Result P/F')
new   2: values ('nikh', examsqn.nextval, 'P P/F')
insert into exam (name, rollno, "Result P/F")
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.EXAM_RESULT_CK) violated

非常感谢您的帮助。

谢谢 :)

4

2 回答 2

1

输出清楚地显示了替换值:

new   2: values ('nikh', examsqn.nextval, 'P P/F')

显然'P P/F' != 'P' and 'P P/F' != 'F'。所以检查约束猛烈。

发生这种情况是因为变量名中有空格。我建议您改用下划线:&Result_PF. 或者只是调用它result

如果您想告诉用户什么是有效值,您需要使用 SQL*Plus 提示符:

accept result_pf prompt "Please enter a value for Result (P/F): "
于 2013-04-18T08:45:01.167 回答
1

要让它工作,您需要做的就是从“&Result P/F”中删除“P/F”

您可以从它试图插入“PP/F”的旧的新输出中看到这一点,这就是您的约束失败的原因。

此外,最好不要将列称为“结果 P/F”,而是使用别名。

干杯

于 2013-04-18T08:45:55.813 回答