我有以下代码:
begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
dbms_random.string('U',5),
trunc(dbms_random.value(0000,9999)),
prod_id from dba_xy.product
prod_name from dba_xy.product;
end loop;
端;
当我运行它时,oracle会给我以下错误消息:
prod_name from dba_xy.product;
*
第8行的错误: ORA-06550:第8行,第29栏: PL / SQL:ORA-00933:SQL命令未正确结束 ORA-06550:第3行第2列: PL / SQL:忽略SQL语句
我要做的是将现有的prod_id和prod_name与插入到发货表中的新数据相关联。我已将prod_name设置为product表中的唯一键,将prod_id设置为主键,并在despatch表中将两者都设置为外键约束。我需要将prod_name包含在despatch表中,以允许表的读者更多地了解需要找到的prod_name等,而不是仅仅给出对它们毫无意义的prod_id。但也许我认为我在发货表中不需要prod_id。 请帮忙。
从发货表中删除prod_id列后,我改变了我的代码:
begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
dbms_random.string('U',5),
trunc(dbms_random.value(0000,9999)),
prod_name from dba_xy.product;
end loop;
端; /
并出现以下关于唯一约束的错误消息: 开始 * 第1行的错误: ORA-00001:违反了唯一约束(DBA_XY.PROD_NAME_UC) ORA-06512:第3行
答案 0 :(得分:3)
您的ORA-00933错误是由于格式错误的SELECT语句造成的:
SELECT desp_id_seq.nextval,
dbms_random.string('U',5),
TRUNC(dbms_random.value(0000,9999)),
prod_id from dba_xy.product
prod_name from dba_xy.product;
......应该是:
SELECT DESP_ID_SEQ.nextval,
DBMS_RANDOM.string('U',5),
TRUNC(DBMS_RANDOM.value(0000,9999)),
t.prod_id,
t.prod_name
FROM dba_xy.product t;
您错过了逗号以分隔prod_id
和prod_name
列,并且在错误的位置还有一个冗余的FROM dba_xy.product声明。
也就是说, dba_xy.despatch
表应该只包含prod_id。如果您需要提供人类可读的数据版本,我建议您构建一个view。例如:
CREATE VIEW despatch_vw AS
SELECT t.prod_id,
p.prod_name
FROM dba_xy.despatch t
JOIN dba_xy.product p ON p.prod_id = t.prod_id
答案 1 :(得分:0)
您是否可以获得唯一约束违规,因为您要插入两次相同的行? “i”应该在insert语句的where子句中使用,还是你真的想要插入两次行?
您的第一个语句有两个FROM子句,这就是您收到语法错误的原因。
select desp_id_seq.nextval,
dbms_random.string('U',5),
trunc(dbms_random.value(0000,9999)),
prod_id, --from dba_xy.product
prod_name from dba_xy.product;