【问题标题】:ora-00933:SQL command not properly endedora-00933:SQL 命令未正确结束
【发布时间】:2010-11-22 03:26:07
【问题描述】:

我有以下代码:

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 行

【问题讨论】:

    标签: sql oracle plsql ora-00933 ora-00001


    【解决方案1】:

    您是否会因为两次插入相同的行而违反唯一约束? "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;    
    

    【讨论】:

      【解决方案2】:

      您的 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。如果您需要提供数据的人类可读版本,我建议您构建一个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
      

      【讨论】:

      • 我尝试运行您的视图代码,但出现以下错误:join dba_xy.product p * ERROR at line 5: ORA-00905: missing keyword
      • 我的错 - 我忘记了实际的 JOIN 标准。立即尝试查看代码。
      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多