我正在尝试使用以下代码将值导入表中,当我尝试编译它时,它运行了整夜并且没有停止。我被告知使用游标,因为为此正在处理的数据量。我的光标的使用方式有问题吗?当我尝试在没有光标的情况下运行它时,出现以下错误:
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 INTO
。SELECT INTO
期望结果为单行,并将变量的值设置为返回的结果。
通过使用 curser,您可以按以下方式引用字段值c_rate.fieldname
另外,您是否意识到您正在为每次迭代更新评级表?你是说这个吗?
你需要
- 不使用
SELECT...INTO
。这是一个单例选择,而不是游标。
将 - 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 表中的某些内容相关的字段 - 您必须解决此问题。但这是一般的想法。