Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 匿名块游标,包括group by和for update_Sql_Oracle_Plsql_Cursor_Ora 06512 - Fatal编程技术网

Sql 匿名块游标,包括group by和for update

Sql 匿名块游标,包括group by和for update,sql,oracle,plsql,cursor,ora-06512,Sql,Oracle,Plsql,Cursor,Ora 06512,我有一张表,上面有以下描述: desc products; Name Null? Type ---------------------- -------- -------------- PID NOT NULL CHAR(4) PNAME VARCHAR2(15) PRICE NUMBER(6,2) DISCN

我有一张表,上面有以下描述:

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
匿名块,其中包含一个游标,该游标具有
GROUPBY
子句,然后在execute部分对游标的结果表执行update/delete。在哪里可以添加GROUPBY子句?哪里出错了?

选择光标中的所有列,因为“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;

我尝试了它,但遇到了以下错误之一时遇到了符号“GROUP”:begin function pragma procedure subtype type@Suttipong.PDid您删除了“GROUP by price for update;”行?1) 它应该在“选择pid、pname、产品价格”之后,不应该在“c5_rec c5%行类型”之后。2) 不能将“for update”与select语句一起使用。你能试试我上次的节目吗?