需要帮助理解循环的游标



我正试图为每只75美元或以上的股票编写一个代码添加一个"*"在STK_ FLAG列中。我的错误报告是:错误报告-

ORA-06550:第15行,第21列:PLS-00201:标识符"STK_FLG"必须为声明的ORA-06550:第15行第5列:PL/SQL:SQL语句已忽略ORA-06550:第23行,第7列:PL/SQL:ORA-00904:";STK_FLG":无效的标识符ORA-06550:第17行第5列:PL/SQL:SQL语句已忽略0655000000-";行%s,列%s:\n%s"*原因:通常是PL/SQL编译错误。*行动:

区块报价

SET SERVEROUTPUT ON
DECLARE
CURSOR CURR
IS
SELECT STK_FLAG
FROM MM_MOVIE
WHERE MOVIE_VALUE * MOVIE_QTY >= 75
FOR UPDATE;
BEGIN
OPEN CURR;

LOOP
FETCH CURR INTO STK_FLG;
UPDATE
MM_MOVIE
SET
STK_FLG= '*'
WHERE
CURRENT OF CURR;
EXIT
WHEN CURR%notfound;
END LOOP;
Commit;
CLOSE CURR;
END;
/

您没有声明游标变量(因此无法放置游标返回的值(。不要将其命名为列名;使用前缀,如v_l_或您想要的任何前缀。

此外,在UPDATE中,您引用了一个不存在的列。光标提示其名称为stk_flag,而不是stk_flg

因此,可能正常的代码是

DECLARE
CURSOR curr IS
SELECT stk_flag
FROM mm_movie
WHERE movie_value * movie_qty >= 75
FOR UPDATE;
l_stk_flag  mm_movie.stk_flag%TYPE;  --> this
BEGIN
OPEN curr;
LOOP
FETCH curr INTO l_stk_flag;
EXIT WHEN curr%NOTFOUND;
UPDATE mm_movie
SET stk_flag = '*'             --> this
WHERE CURRENT OF curr;
END LOOP;
COMMIT;
CLOSE curr;
END;
/

为什么要使用pl/sql匿名块?即使存在";外部";对封装到pl/sql中的功能的需求为什么要使用游标和循环?使用可能正常的代码(来自@Littlefoot(,检索满足条件的单个列,迭代获取该列的结果记录集,但不执行任何操作,并在循环的每次迭代中使用文字值更新单行。SQL是为一次处理整组行而设计的。您的处理可以在单个更新语句中完成。假设存在对pl/sql块的外部需求,那么您的代码将简化为:

BEGIN
UPDATE mm_movie
SET stk_flag = '*'   
WHERE movie_value * movie_qty >= 75;

COMMIT;
END;   

带走:在使用SQL时,停止从迭代(循环(的角度思考。相反,考虑要处理的所有对象的公共性(集合(。一种不同的看待问题的方式及其相应的解决方案。习惯这种想法需要一些时间,但从长远来看,您的SQL和过程将因此而大大改进。无论是在性能还是清晰度方面。

最新更新