sql - 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)
如果siglas是ONU,我需要将值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
谢谢你。
解决方案
您似乎想更新所有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;
推荐阅读
- modelica - Dymola中使用牛顿迭代法的详细过程
- angular - 使用 PWA 版本的 Angular App 时出现 404
- outlook - 使用 Outlook Web 加载项记录传入和传出电子邮件
- javascript - 无法在 typescript 中配置 Apolloserver 的数据源
- macos - 需要帮助重置密码 MacBook Pro
- c# - 从存储在 listView 中的路径构建树结构
- applescript - 如何使用applescript控制AirPods Pro的降噪?
- php - 在块 laravel 中返回一个数组
- gnuplot - Gnuplot - xrange 的设置
- javascript - 我的客户出现错误,但不是来自我的客户