如何解决动态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;
但是您可以这样做并不意味着您应该这样做。这很容易受到SQL注入的攻击,而且似乎不是一种非常安全,明智或有效的方式来处理系统中的数据操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。