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;

終わり;

実行すると、オラクルから次のエラーメッセージが表示されます。

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 をディスパッチ テーブルに含めて、テーブルの読者が意味をなさない prod_id を単に与えるのではなく、prod_name を見つける必要があるものなどをより理解できるようにする必要があります。しかし、おそらく私は発送テーブルに 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) violationd 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_id列と列を区切るコンマが欠落しておりprod_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

同じ行を 2 回挿入しているため、一意の制約違反が発生していませんか? "i" は挿入ステートメントの where 句で使用することになっていますか、それとも行を 2 回挿入したいですか?

最初のステートメントには 2 つの 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 に答える