oracle – 带有动态SQL语句的Cursor For Loop

前端之家收集整理的这篇文章主要介绍了oracle – 带有动态SQL语句的Cursor For Loop前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法用动态sql语句执行Cursor For循环?

如果我不想声明一条记录,我可以这样做(只有当我声明了光标..):

For I in cuSelect Loop
  dbms_output.put_line(I.NAME);
End Loop;

我可以打开一个动态sql语句的游标:

Open cuSelect For 'Select * From TAB_X';
Fetch ceSelect Into recSelect;
Close cuSelect;

但要做到这一点,我必须首先声明记录.

现在我的问题是我必须为一个非常大而复杂的动态sql语句打开Cursor.记录的结构是未知的.有没有办法打开一个变量光标并用“未声明”记录迭代它?

解决方法

我认为你可以用DBMS_sql包做你想做的事.

你也可以看看这些:

> Using Dynamic SQL
> COLUMN_VALUE Procedure

例如:

declare
  TYPE curtype IS REF CURSOR;
  src_cur      curtype;
  curid        NUMBER;
  namevar  VARCHAR2(50);
  numvar   NUMBER;
  datevar  DATE;
  desctab  DBMS_sql.DESC_TAB;
  colcnt   NUMBER;
  dsql varchar2(1000) := 'select card_no from card_table where rownum = 1';
begin
  OPEN src_cur FOR dsql;

  -- Switch from native dynamic sql to DBMS_sql package.
  curid := DBMS_sql.TO_CURSOR_NUMBER(src_cur);
  DBMS_sql.DESCRIBE_COLUMNS(curid,colcnt,desctab);

  -- Define columns.
  FOR i IN 1 .. colcnt LOOP
    IF desctab(i).col_type = 2 THEN
      DBMS_sql.DEFINE_COLUMN(curid,i,numvar);
    ELSIF desctab(i).col_type = 12 THEN
      DBMS_sql.DEFINE_COLUMN(curid,datevar);
    ELSE
      DBMS_sql.DEFINE_COLUMN(curid,namevar,50);
    END IF;
  END LOOP;

  -- Fetch rows with DBMS_sql package.
  WHILE DBMS_sql.FETCH_ROWS(curid) > 0 LOOP
    FOR i IN 1 .. colcnt LOOP
      IF (desctab(i).col_type = 1) THEN
        DBMS_sql.COLUMN_VALUE(curid,namevar);
        dbms_output.put_line(namevar);
      ELSIF (desctab(i).col_type = 2) THEN
        DBMS_sql.COLUMN_VALUE(curid,numvar);
        dbms_output.put_line(numvar);
      ELSIF (desctab(i).col_type = 12) THEN
        DBMS_sql.COLUMN_VALUE(curid,datevar);
        dbms_output.put_line(datevar);
      END IF;
    END LOOP;
  END LOOP;

  DBMS_sql.CLOSE_CURSOR(curid);

end;

猜你在找的Oracle相关文章