Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写带参数的select语句并使用PL/SQL进行迭代?_Sql_Oracle_Loops_Plsql - Fatal编程技术网

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

如何编写带参数的select语句并使用PL/SQL进行迭代?,sql,oracle,loops,plsql,Sql,Oracle,Loops,Plsql,我想在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; 有没有可行的方法可以做

我想在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;

有没有可行的方法可以做到这一点?提前感谢您。

如果您确实需要这种动态,请将其用作弱类型游标的选项之一。下面是本例中双表使用的示例

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.
请注意,如果您决定使用批量收集,您需要知道变量或集合的类型。结果将被预先获取。其次,由于标识符(例如列名、表名)无法绑定,因此必须在某种验证之后显式连接它们,以防止SQL注入

您应该像这样使用executeimmediate来使用动态SQL

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或在动态sql中使用in-out参数的更多信息,请阅读下面的文章


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

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;
可能重复的