0

次の説明を含むテーブル製品があります。

desc products;

 Name                  Null?    Type
---------------------- -------- --------------
 PID                   NOT NULL CHAR(4)
 PNAME                          VARCHAR2(15)
 PRICE                          NUMBER(6,2)
 DISCNT_RATE                    NUMBER(3,2)

私のカーソルステートメントは次のとおりです。

declare
  cursor c5 is
    select pid, pname, price
      from products
    c5_rec c5%rowtype
      group by price for update;

begin
  for c5_rec in c5
  loop
    if(c5_rec.price > 100) then
      delete from products where current of c5;
    end if;
  end loop;
end;
/

4 行目と 5 行目に group by と rowtype を含めないと、エラーが発生します。

integrity constraint (MYID.SYS_C0012393) violated - child record found ORA06512: at line 7

私がやろうとしているのはPL/SQL、カーソルを含む句を含む無名ブロックを作成GROUP BYし、実行セクションでカーソルの結果のテーブルで更新/削除を実行することです。group by 句はどこに追加できますか? どこが間違っていますか?

4

1 に答える 1

0

「c5_rec」のデータ型はテーブル内の列の数と列のデータ型と同じであるため、カーソル内のすべての列を選択します。

cursor c5 is
select pid, pname, price, discnt_rate from products

または、「c5_rec」データ型を価格列と同じになるように変更できます。

cursor c5 is
select price from products group by price;
c5_rec c5%products.price%TYPE;

このようにすることもできます。すべての列ではなく、複数の列が必要な場合は柔軟です。

declare 
--cursor c5 is
--select pid, pname, price from products
--c5_rec c5%rowtype
--group by price for update;
begin
for c5_rec in (select price from products group by price)
loop
if(c5_rec.price > 100) then
delete from products
where price = c5_rec.price;
end if;
end loop;
end;
于 2015-11-09T03:26:06.797 に答える