Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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 第一个循环…它没有work@MuentaCovil:对于(…)循环中的r也是一个光标。原始脚本的唯一问题是过早地打开第二个游标,当然前提是所有行的初始值都为null。否则,您必须以UPDATE pais SET cascos=NULL启动所有这一切@Tho_Sql_Oracle_Plsql - Fatal编程技术网

Sql 第一个循环…它没有work@MuentaCovil:对于(…)循环中的r也是一个光标。原始脚本的唯一问题是过早地打开第二个游标,当然前提是所有行的初始值都为null。否则,您必须以UPDATE pais SET cascos=NULL启动所有这一切@Tho

Sql 第一个循环…它没有work@MuentaCovil:对于(…)循环中的r也是一个光标。原始脚本的唯一问题是过早地打开第二个游标,当然前提是所有行的初始值都为null。否则,您必须以UPDATE pais SET cascos=NULL启动所有这一切@Tho,sql,oracle,plsql,Sql,Oracle,Plsql,第一个循环…它没有work@MuentaCovil:对于(…)循环中的r也是一个光标。原始脚本的唯一问题是过早地打开第二个游标,当然前提是所有行的初始值都为null。否则,您必须以UPDATE pais SET cascos=NULL启动所有这一切@Thorstenketner初始值为空。实际上,第二个游标正在更新行-所有行。第一个是问题所在。没有行被更新为“S”。谢谢你的帮助man@MuentaCovil您确定没有更新任何行吗?看起来它们是,问题是它们在第二个循环中再次被设置为null。检查起


第一个循环…它没有work@MuentaCovil:
对于(…)循环中的r也是一个光标。原始脚本的唯一问题是过早地打开第二个游标,当然前提是所有行的初始值都为null。否则,您必须以
UPDATE pais SET cascos=NULL启动所有这一切@Thorstenketner初始值为空。实际上,第二个游标正在更新行-所有行。第一个是问题所在。没有行被更新为“S”。谢谢你的帮助man@MuentaCovil您确定没有更新任何行吗?看起来它们是,问题是它们在第二个循环中再次被设置为null。检查起来应该很简单,我完全确定。如果C2从代码中删除,C1仍然不会更新任何行。啊,我明白了,这是家庭作业。那么请看我在威廉·罗伯逊回答下的评论。可能初始CASCO不是空的。
SET SERVEROUTPUT ON;
DECLARE
    CURSOR C1 IS SELECT cascos FROM pais P, organizacion O, pertenece_a PE WHERE P.cod_pais=PE.cod_pais AND O.cod_organizacion=PE.cod_organizacion AND O.siglas='ONU' FOR UPDATE;
    CURSOR C2 IS SELECT cascos FROM pais WHERE cascos IS NULL FOR UPDATE;
    registro1 C1%ROWTYPE;
    registro2 C2%ROWTYPE;
BEGIN
    IF NOT C1%ISOPEN THEN
            OPEN C1;
    END IF;
    IF NOT C2%ISOPEN THEN
            OPEN C2;
    END IF;
    LOOP
        FETCH C1 INTO registro1;
        EXIT WHEN C1%NOTFOUND;
        UPDATE pais SET cascos='S' WHERE CURRENT OF C1;
    END LOOP;
    LOOP
        FETCH C2 INTO registro2;
        EXIT WHEN C2%NOTFOUND;
        UPDATE pais SET cascos='N' WHERE CURRENT OF C2;
    END LOOP;
    CLOSE C1;
    CLOSE C2;
END;
/
SELECT * FROM pais WHERE cascos='S';
PL/SQL procedure successfully completed.

no rows selected
NOMBRE                         SIGLAS
------------------------------ ------
Venezuela                      ONU   
Venezuela                      OEA   
Venezuela                      MS    
Venezuela                      OPEP  
Estados Unidos                 ONU   
Estados Unidos                 OTAN  
Estados Unidos                 OEA   
Estados Unidos                 APEC  
Estados Unidos                 OCDE  
Estados Unidos                 OSCE  
Estados Unidos                 TLCAN 
begin
    for r in (
        select p.cod_pais
        from   pais p
               join pertenece_a pe on pe.cod_pais = p.cod_pais
               join organizacion o on o.cod_organizacion = pe.cod_organizacion
        where  o.siglas = 'ONU'
        and    nvl(p.cascos,'?') <> 'S'
        for    update
    )
    loop
        update pais set cascos = 'S'
        where  cod_pais = r.cod_pais;
    end loop;

    update pais set cascos = 'N' where cascos is null;
end;
update pais
set cascos = 
  case when cod_pais in (
                          select pe.cod_pais 
                          from pertenece_a pe
                          join organizacion o using (cod_organizacion)
                          where o.siglas = 'ONU'
                        )
    then 'S'
    else 'N'
  end;