动态SQL与for循环PL / SQL

问题描述

以下查询需要转换为动态SQL,而无需使用硬代码游标SQL, 使用l_query,我不知道它将作为参数来使用l_query。 在循环内部,我需要执行另一个作为参数附带的插入查询(l_insert_query)。

您的律师将不胜感激

DECLARE
    CURSOR cust
    IS
        SELECT *
          FROM customer
         WHERE id < 500;
BEGIN
    l_query := 'SELECT * FROM customer  WHERE id < 5';
    l_insert_query :=
        'insert into data ( name,mobile) values ( cust.name,cust.mobile)';

    FOR r_cust IN cust
    LOOP
        EXECUTE IMMEDIATE l_insert_query;
    END LOOP;
END;

解决方法

可以使用动态PL / SQL块执行此操作:

declare
  l_query varchar2(100) := 'SELECT * FROM customer  WHERE id < 5';
  l_insert varchar2(100) := 'insert into data ( name,mobile) values ( cust.name,cust.mobile)';
  l_plsql varchar2(4000);
begin
  l_plsql := '
begin
  for cust in (' || l_query || ') loop
    ' || l_insert || ';
  end loop;
end;
';

  dbms_output.put_line(l_plsql);
  execute immediate l_plsql;
end;
/

l_plsql语句最终通过使用游标查询和插入语句而生成为PL / SQL块:

begin
  for cust in (SELECT * FROM customer  WHERE id < 5) loop
    insert into data ( name,cust.mobile);
  end loop;
end;

db<>fiddle

但是您可以这样做并不意味着您应该这样做。这很容易受到SQL注入的攻击,而且似乎不是一种非常安全,明智或有效的方式来处理系统中的数据操作。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...