代码之家  ›  专栏  ›  技术社区  ›  cifrapalota

如何编写带有参数的select语句并用PL/SQL进行迭代?

  •  0
  • cifrapalota  · 技术社区  · 8 年前

    我想在带有PL/SQL的函数中创建一个带有参数的for循环。 我想达到这样的目标:

    CREATE OR REPLACE FUNCTION f_example(p_table, p_column)
    BEGIN
    FOR v_iter in (EXECUTE IMMEDIATE 'select ' || p_column || ' from ' || p_table) LOOP
    DBMS_OUTPUT.PUTLINE(v_iter.p_column);
    END LOOP;
    END;
    

    3 回复  |  直到 8 年前
        1
  •  1
  •   Nick Krasnov    8 年前

    如果您真的需要这种动态,那么使用弱类型游标(作为选项之一)。下面是一个示例(使用 dual 表)。

    set serveroutput on;
    
    declare
      l_c1 sys_refcursor;
      l_query varchar2(255);   
      --------------------
      l_column  varchar2(11) := 'dummy'; -- column name
      l_tabname varchar2(11) := 'dual';  -- table name
      --------------------
      l_res varchar2(1);
     begin
        l_query := 'select ' || dbms_assert.simple_sql_name(l_column) ||
                   '  from ' || dbms_assert.simple_sql_name(l_tabname);
       open l_c1 for l_query;
       loop
         fetch l_c1 into l_res;
         exit when l_c1%notfound;
         dbms_output.put_line(l_res);
       end loop;
    
     end;
    

    X
     PL/SQL procedure successfully completed.
    

    注意,如果决定使用,您需要知道变量的类型(或集合) bulk collect into

        2
  •  0
  •   Avrajit Roy    8 年前

    希望下面的代码片段能有所帮助。

    CREATE OR REPLACE
      FUNCTION dummy_function_test(
          lv_col IN VARCHAR2,
          lv_tab IN VARCHAR2)
          RETURN
          DBMS_SQL.VARCHAR2_TABLE
      AS
        lv_table DBMS_SQL.VARCHAR2_TABLE;
      BEGIN
        EXECUTE IMMEDIATE 'select '||lv_col||' from '||lv_tab BULK COLLECT INTO lv_table;
        FOR I IN lv_table.FIRST..lv_table.LAST
        LOOP
          dbms_output.put_line(lv_table(i));
        END LOOP;
        RETURN lv_table;
      END;
    
    DECLARE
      lv_1 dbms_sql.varchar2_table;
    BEGIN
      lv_1:=dummy_function_test('sysdate','dual');
    END;
    
        3
  •  0
  •   Vecchiasignora    8 年前

    你应该使用 dynamic SQL by using EXECUTE IMMEDIATE 这样地

    CREATE OR REPLACE FUNCTION f_example(p_table, p_column) return .... is
       plsql_block varchar2(4000);
    begin
       plsql_block : = 'BEGIN
           FOR v_iter in (select ' || p_column || ' from ' || p_table ||' ) LOOP
           DBMS_OUTPUT.PUTLINE(v_iter.p_column);
           END LOOP;
         END;'
    
    EXECUTE IMMEDIATE plsql_block;
    
    END;
    

    有关动态的详细信息 sql using in out dynamic sql

    https://docs.oracle.com/cloud/latest/db112/LNPLS/dynamic.htm#LNPLS011