使用下面的代码,我试图在评论中搜索某些单词(SEED WORDS)。然后,根据每个评论中的“种子”单词的数量,我得出一个评分编号。每个酒店ID有多个评论。我试图将其输入到具有以下列(HOTEL_ID,CATEGORY_ID,RATING)的“评分”表中。每个种子字都有一个与1,2,3或4相关的类别。到目前为止,我收到的错误提示必须声明'LV_RATE_NUM'。
DECLARE
lv_hotel NUMBER(4,0);
lv_rate_num NUMBER(4);
lv_rate NUMBER(1,1);
lv_pol NUMBER(1,1);
i number(4,0);
CURSOR cur_rate IS
SELECT a.IDHOTEL, INSTR(a.review,b.seed_words), b.polarity
INTO lv_hotel, lv_rate_num,lv_pol
FROM review a, SEEDWORDS b;
BEGIN
i :=1;
lv_hotel := i;
FOR rec_hotel IN cur_rate LOOP
IF rec_hotel.lv_rate_num > 0
THEN lv_rate := lv_rate_num;
ELSIF rec_hotel.lv_rate_num = 0
THEN lv_rate_num := 8.6;
i := i+1;
END IF;
END LOOP;
INSERT INTO RATINGS
VALUES (lv_hotel, 'CATID',lv_rate);
END;
答案 0 :(得分:2)
INTO
子句仅在单例SELECT中使用-即,仅返回一行的SELECT。您的代码可以简化很多:
DECLARE
i NUMBER := 1;
lv_hotel NUMBER := 1;
lv_rate NUMBER;
BEGIN
FOR rec_hotel IN (SELECT INSTR(a.review, b.seed_words) AS LV_RATE_NUM
FROM review a
CROSS JOIN SEEDWORDS b)
LOOP
IF rec_hotel.LV_RATE_NUM > 0 THEN
lv_rate := rec_hotel.LV_RATE_NUM;
ELSIF rec_hotel.LV_RATE_NUM = 0 THEN
lv_rate := 8.6;
i := i+1;
END IF;
END LOOP;
INSERT INTO RATINGS(HOTEL_ID, CATEGORY_ID,RATING)
VALUES (lv_hotel, 'CATID', lv_rate);
END;
我强烈建议您避免在数字上指定精度和小数位数。它们很少需要,并且是潜在问题的根源。请注意,我很确定这仍然不会达到您的预期目的,但是您可以将其用作入门的方式。
答案 1 :(得分:0)
由于在游标查询中使用了into
,因此出现错误。您可以将alias
赋予游标列,并在循环中使用该列名。
DECLARE
lv_hotel NUMBER(4,0);
lv_rate_num NUMBER(4);
lv_rate NUMBER(1,1);
lv_pol NUMBER(1,1);
i number(4,1);
CURSOR cur_rate IS
SELECT a.IDHOTEL, INSTR(a.review,b.seed_words) as rate_num, b.polarity as pol
--INTO lv_hotel, lv_rate_num,lv_pol
FROM review a, SEEDWORDS b;
BEGIN
i :=1;
lv_hotel := i;
FOR rec_hotel IN cur_rate LOOP
IF rec_hotel.rate_num > 0 -- used cursor column alias name
THEN lv_rate := lv_rate_num; -- lv_rate_num is not initialized and you are using it here. You must Consider changing the logic
ELSIF rec_hotel.rate_num = 0
THEN lv_rate_num := 8.6;
i := i+1;
END IF;
END LOOP;
INSERT INTO RATINGS
VALUES (lv_hotel, 'CATID',lv_rate);
END;
您的Insert语句不在循环中,因此它将仅在表中插入一条记录。
干杯!