create or replace package body ETL is
procedure run_all
is
begin
declare
cursor abc is select distinct  d.sex from d ;
bb d.sex%type;
begin
open abc;  fetch abc into bb;
 
   
   for bb in abc
    
     if bb = '男' then       insert into nan select * from d where d.sex='男';
       
       end if;
         fetch abc into bb;
       
       end loop;
        commit;
close abc;
    end;
    end run_all;
        end ETL;
if bb = '男' then 报错了 
pls-00103 出现符号if在需要下列之一时 - 
麻烦看看谢谢
谁能举个  for 循环 套 for  循环的 加游标的 小例子谢谢 

解决方案 »

  1.   

    /* Formatted on 2011/11/01 15:06 (Formatter Plus v4.8.8) */
    CREATE OR REPLACE PACKAGE BODY etl
    IS
       PROCEDURE run_all
       IS
          CURSOR abc
          IS
             SELECT DISTINCT d.sex
                        FROM d;      bb   d.sex%TYPE;
       BEGIN
          FOR bb IN abc
          LOOP
             IF bb.sex = '男'
             THEN
                INSERT INTO nan
                   SELECT *
                     FROM d
                    WHERE d.sex = '男';
             END IF;
          END LOOP;      COMMIT;
       END run_all;
    END etl;
      

  2.   

    ORA-06511: PL/SQL: 游标已经打开
    ORA-06512: 在 "TT.ETL", line 6
    ORA-06512: 在 "TT.ETL", line 14
    ORA-06512: 在 line 2
    执行楼上 报错了 帮我看看谢谢
      

  3.   


    bb.sex  为什么可以这么用呢谢谢
      

  4.   

    bb不需要定义,Oracle已经帮我们隐含定义了,可以直接取值用
    CREATE OR REPLACE PACKAGE BODY etl
    IS
       PROCEDURE run_all
       IS
          CURSOR abc
          IS
             SELECT DISTINCT d.sex
                        FROM d;      --bb   d.sex%TYPE;
       BEGIN
          FOR bb IN abc
          LOOP
             IF bb.sex = '男'
             THEN
                INSERT INTO nan
                   SELECT *
                     FROM d
                    WHERE d.sex = '男';
             END IF;
          END LOOP;      COMMIT;
       END run_all;
    END etl;
      

  5.   


    bb。sex 是什么意思呢 是用的隐式游标吗 谢谢 现在已经能插入语句了
      

  6.   

    是隐式游标,所以不需要open fetch和colse,bb是CURSOR abc中的取值当前行,bb.sex是取sex这列的值
      

  7.   


    要是  
    CREATE OR REPLACE PACKAGE BODY etl
    IS
       PROCEDURE run_all
       IS
          CURSOR abc
          IS
             SELECT DISTINCT d.sex,d.zhi     FROM d;     
       BEGIN
          FOR bb IN abc
          LOOP
             IF bb.sex = '男'and bb.zhi =4
             THEN
                INSERT INTO nan
                   SELECT *
                     FROM d
                    WHERE d.sex = '男';
             END IF;
          END LOOP;      COMMIT;
       END run_all;
    END etl;bb.sex 和 bb.zhi  是按照SELECT DISTINCT d.sex,d.zhi     FROM d;顺序吗 我这样执行了 没有按照值=4 来插入谢谢
      

  8.   

    上面部分没问题,是下面这句insert语句的原因吧
     INSERT INTO nan
      SELECT *
      FROM d
      WHERE d.sex = '男';
      

  9.   

    嗯 不用游标 直接 where 条件 效果一样  怎么才能体现出游标的作用呢
      

  10.   

    我看的 oracle 入门 还有别的书推荐吗
      

  11.   

    <Oracle9i PL/SQL从入门到精通>这本书应该还不错http://download.csdn.net/detail/ker79/355516
    我看的是Oracle11g SQL PL/SQL从入门到精通