5

我有以下代码:

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 设置为产品表中的唯一键,并将 prod_id 设置为主键,并将两者都设置为发货表中的外键约束。我需要将 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;

结尾; /

并且出现了关于唯一约束的以下错误消息:begin * ERROR at line 1: ORA-00001: unique constraint (DBA_XY.PROD_NAME_UC) 违反 ORA-06512: at line 3

4

2 回答 2

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_idprod_name列的逗号,并且在错误的位置还有一个多余的 FROM dba_xy.product 声明。

也就是说,该dba_xy.despatch表应该只包含 prod_id。如果您需要提供数据的人类可读版本,我建议您构建一个视图。例子:

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
于 2009-08-24T02:45:20.487 回答
0

您是否会因为两次插入相同的行而违反唯一约束?是否应该在插入语句的 where 子句中使用“i”,或者您真的希望将行插入两次?

您的第一条语句有两个 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;    
于 2009-08-24T01:47:25.913 回答