我有这张桌子:
| Pattern |
----------------------
|category |varchar|
|patternexpr |varchar|
例如,在此表中,我可以使用类别ISBN及其模式来识别它。
我想创建一个带有三个参数的过程:一个表T,一个列C和一个类别。我想打印T表中C列中的每一行,这些行都遵循相关的模式。
这就是我所做的(使用正确答案更新):
CREATE OR REPLACE PROCEDURE Recognize(T varchar,C varchar,catego varchar)
IS
v_patt Pattern.CATEGOR%Type;
BEGIN
SELECT patternexpr INTO v_patt
FROM Pattern WHERE CATEGOR=catego;
FOR myrow IN (SELECT C FROM T WHERE REGEXP_LIKE(C, v_patt) LOOP
dbms_output.put_line(myrow.C);
END LOOP;
END;
/
如何在不知道“DECLARE”位置中我的变量patt的值的情况下声明游标来打印我的结果?我应该在第一次查询后添加另一个声明并开始...结束bloc吗?最好的方法是什么?
(我正在研究Oracle SGBD)
答案 0 :(得分:1)
使用REF CURSOR
为此目的提取记录。
CREATE OR REPLACE PROCEDURE Recognize(
T VARCHAR2,
C VARCHAR2,
catego VARCHAR2)
IS
v_patt Pattern.CATEGOR%Type;
v_cur_txt VARCHAR2(400);
TYPE cur_type
IS
REF
CURSOR;
v_cur cur_type;
v_c VARCHAR2(20);
BEGIN
SELECT patternexpr INTO v_patt FROM Pattern WHERE CATEGOR=catego;
v_cur_txt := 'SELECT '||C||' FROM '|| T ||' WHERE REGEXP_LIKE('||C||', '''||v_patt||''')';
OPEN v_cur FOR v_cur_txt;
LOOP
FETCH v_cur INTO v_c;
EXIT
WHEN v_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_c);
END LOOP;
CLOSE v_cur;
END;
/
注意::在EXCEPTION
等代码中包含正确的NO_DATA_FOUND
处理。按照Nicholas的说法,使用dbms_assert
包进行一些验证
答案 1 :(得分:0)
在Oracle中,您不需要显式游标:
for myrow in (select c from t where regexp_like(c, patt) loop
dbms_output.put_line(myrow.c);
end loop;
我会将模式变量称为v_patt
;这样,声明的变量不会与列名混淆。