如何编写带参数的select语句并使用PL/SQL进行迭代?
我想在PL/SQL函数中创建一个带有参数的for循环。 我想达到这样的目标:如何编写带参数的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; 有没有可行的方法可以做
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;
可能重复的