Oracle 使用游标的PL/SQL更新
我创建了一个匿名块,该块将删除电子邮件列中@之前的所有内容Oracle 使用游标的PL/SQL更新,oracle,plsql,Oracle,Plsql,我创建了一个匿名块,该块将删除电子邮件列中@之前的所有内容 DECLARE v_id NUMBER(10); v_email VARCHAR2(30); i NUMBER(1) := 0; CURSOR cursor_name IS SELECT Id, (substr (email, instr (email,'@',1) + 1 )) AS Domain FROM invoices WHERE id=31232681; BEGIN
DECLARE
v_id NUMBER(10);
v_email VARCHAR2(30);
i NUMBER(1) := 0;
CURSOR cursor_name IS
SELECT Id, (substr (email, instr (email,'@',1) + 1 )) AS Domain
FROM invoices
WHERE id=31232681;
BEGIN
OPEN cursor_name;
LOOP
v_email := '@' || v_email;
FETCH cursor_name INTO v_id, v_email;
UPDATE invoices
SET email = v_email
WHERE Id = v_id;
EXIT WHEN cursor_name%NOTFOUND
END LOOP;
CLOSE cursor_name;
END;
但获取PLS-00103错误:
PLS-00103: Encountered the symbol "(" when expecting one of the following:
:= . ) , @ % default character
The symbol ":=" was substituted for "(" to continue
你能帮我知道是什么问题吗
解决方案
分号在以下位置丢失:
未找到光标名称%1时退出
你能试试吗
DECLARE
v_id NUMBER(10);
v_email VARCHAR2(30);
i NUMBER(1) := 0;
CURSOR cursor_name IS
SELECT Id, (substr (email, instr (email,'@',1) + 1 )) AS Domain
FROM invoices
WHERE id=31232681;
BEGIN
OPEN cursor_name;
LOOP
v_email := '@' || v_email;
FETCH cursor_name INTO v_id, v_email;
UPDATE invoices
SET email = v_email
WHERE Id = v_id;
EXIT WHEN cursor_name%NOTFOUND;
END LOOP;
CLOSE cursor_name;
END;
我现在看到了您的解决方案,很抱歉:)您不需要游标或PL/SQL。为什么不直接使用
updateinvoicessetemail=substr(..),其中id=31232681代码>当前发布的代码在“退出时…”行末尾缺少分号。但是,是的,正如@a_horse所说的-PL/SQL的目的是什么,当update
本身这样做时?他正在连接值,他可能有多行相同的Id,并且想要连接电子邮件感谢您的回答!然而,如果你解释你在做什么以及为什么它能解决用户的问题,你的答案将对其他人更有帮助(并且更有可能获得更多的选票)