问题描述
以下查询需要转换为动态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注入的攻击,而且似乎不是一种非常安全,明智或有效的方式来处理系统中的数据操作。