oracle - 带有动态 SQL 语句的游标 For 循环

标签 oracle dynamic plsql database-cursor

有没有办法用动态 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, i, datevar);
        ELSE
          DBMS_SQL.DEFINE_COLUMN(curid, i, 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, i, namevar);
            dbms_output.put_line(namevar);
          ELSIF (desctab(i).col_type = 2) THEN
            DBMS_SQL.COLUMN_VALUE(curid, i, numvar);
            dbms_output.put_line(numvar);
          ELSIF (desctab(i).col_type = 12) THEN
            DBMS_SQL.COLUMN_VALUE(curid, i, datevar);
            dbms_output.put_line(datevar);
          END IF;
        END LOOP;
      END LOOP;
    
      DBMS_SQL.CLOSE_CURSOR(curid);
    
    end;
    

    关于oracle - 带有动态 SQL 语句的游标 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15786953/

    相关文章:

    oracle - 如何检查程序包中是否存在程序?

    sql - 将 PL/SQL 代码运行到 Oracle 11g Express Edition - 错误

    oracle - 难倒并寻求输入 Re : Database Design

    c# - RDLC LocalReport 导出到 Excel 真的很慢

    oracle - 加快 Oracle DB 大量记录的更新速度

    sql - 如何在 PL/SQL 中通过 XML 执行多个循环

    sql - 如何用SQL划分两个SELECT语句以获得百分比

    javascript - 链接到每天都会变化的 URL?

    javascript - 动态 Javascript - 这有效吗?

    php - PHP、SQL 和 jQuery 之间的动态 ID