从select语句中打印多行

时间:2017-10-07 14:54:55

标签: sql oracle plsql procedure

我有这张桌子:

|      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)

2 个答案:

答案 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;这样,声明的变量不会与列名混淆。