首页 > 解决方案 > PL/SQL 游标的问题

问题描述

这些是表格:

SQL> DESC pais;

Name                                      Null?    Type                        
----------------------------------------- -------- ----------------------------
COD_PAIS                                  NOT NULL NUMBER(4)                   
NOMBRE                                             VARCHAR2(30)                
CAPITAL                                            VARCHAR2(20)                
EXTENSION                                          NUMBER(10)                  
MONEDA                                             VARCHAR2(20)                
NUM_HAB                                            NUMBER(10)                  
PIB                                                NUMBER(20,2)                
CONTINENTE                                         VARCHAR2(20)                
CASCOS                                             CHAR(1)                     
SQL> DESC pertenece_a;

Name                                      Null?    Type                        
----------------------------------------- -------- ----------------------------
COD_ORGANIZACION                          NOT NULL NUMBER(10)                  
COD_PAIS                                  NOT NULL NUMBER(4)                   
SQL> DESC organizacion;

Name                                      Null?    Type                        
----------------------------------------- -------- ----------------------------
COD_ORGANIZACION                          NOT NULL NUMBER(10)                  
NOMBRE                                             VARCHAR2(80)                
SIGLAS                                             VARCHAR2(6)                 

如果siglasONU,我需要将值cascos更新为S。如果不是,则必须将其更新为N。这是我的代码。SQL Developer 没有报告任何错误,但是 C1 游标更改没有更新。我必须使用游标。

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';

SQL Developer 输出只是说:

PL/SQL procedure successfully completed.

no rows selected

可能是什么错误?问题可能是一排 pais 可以与多排 (siglas) 组织相关联吗?例如:

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 

谢谢你。

标签: sqloracleplsql

解决方案


您似乎想更新所有pais行。与 ONU 匹配cascos = 'S'的人获得,其他人获得cascos = 'N'。为此,您可以仅使用更新语句,这甚至比使用 PL/SQL 更快。

例如:

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;

推荐阅读