我是否正确使用了光标?它不会停止运行



我正在尝试使用以下代码将值导入表中,当我尝试编译它时,它运行了整夜并且没有停止。我被告知使用游标,因为为此正在处理的数据量。我的光标的使用方式有问题吗?当我尝试在没有光标的情况下运行它时,出现以下错误:

ORA-01422:精确提取返回的行数超过请求的行数

DECLARE
lv_count NUMBER;
lv_cat NUMBER;
CURSOR c_rate IS
SELECT INSTR(a.review, b.seed_words), b.categoryid
INTO lv_count, lv_cat
FROM review a, SeedWords b
WHERE a.IDhotel = 1;    
BEGIN
FOR rec_rate IN c_rate
LOOP
UPDATE RATINGS 
SET RATING = lv_count;
COMMIT;
END LOOP;
END;

我的表格如下: 评分表(尝试填写"评分"列(:

HOTELID | CATEGORYID | RATING
1    |        1   |    5
1    |        2   |    10
1    |        3   |    2
1    |        4   |    6
2    |        1   |    6
2    |        2   |    10 
2    |        3   |    4
2    |        4   |    2

审查表:

REVIEW ID | Hotel Id | Review 
1      |   1      |  "LARGE STRING"
2      |   1      |  "LARGE STRING"
3      |   1      |  "LARGE STRING"
4      |   1      |  "LARGE STRING"
5      |   1      |  "LARGE STRING"
6      |   1      |  "LARGE STRING"
7      |   2      |  "LARGE STRING"
8      |   2      |  "LARGE STRING"
9      |   2      |  "LARGE STRING"
10      |   2      |  "LARGE STRING"

种子词表:

SEED ID| SEED_WORD|CATEGORYID
1    |  "WORD"  |      1
2    |  "WORD"  |      1
3    |  "WORD"  |      2
4    |  "WORD"  |      2
5    |  "WORD"  |      3
6    |  "WORD"  |      3
7    |  "WORD"  |      4
8    |  "WORD"  |      4

我还有一个非常小的类别表,如下所示:

CategoryID | Category_NAME
1          |      PRICE
2          |      SERVICE
3          |      CLEANLINESS 
4          |      LOCATION

您不再需要使用光标SELECT INTOSELECT INTO期望结果为单行,并将变量的值设置为返回的结果。

通过使用 curser,您可以按以下方式引用字段值c_rate.fieldname

另外,您是否意识到您正在为每次迭代更新评级表?你是说这个吗?

你需要

  1. 不使用SELECT...INTO。这是一个单例选择,而不是游标。
  2. WHERE 子句添加到 UPDATE 语句中,以便只更新所需的单行。

所以你的代码块应该看起来像

BEGIN
FOR rec_rate IN (SELECT INSTR(a.review, b.seed_words) AS NCOUNT,
b.categoryid
FROM review a, SeedWords b
WHERE a.IDhotel = 1)
LOOP
UPDATE RATINGS 
SET RATING = rec_rate.NCOUNT
WHERE RATINGS.something = rec_rate.something_else;  -- I have no idea how your tables relate - fix this
COMMIT;
END LOOP;  -- rec_rate
END;

不幸的是,我对您的数据一无所知,所以我不知道您可以在rec_rate光标中检索与 RATING 表中的某些内容相关的字段 - 您必须解决此问题。但这是一般的想法。

最新更新