在 FOR 循环中动态引用 Table
Dynamically Refer To Table In FOR loop
我正在 Oracle 数据库中开发一个脚本,最终会向有问题的用户发送电子邮件。我只想向用户发送一次电子邮件,并且需要动态引用一些物化视图才能这样做,否则将不得不编写大约 40 个不同的版本,我只需更改下面循环的 table 名称。
我有一个循环目前看起来像:
for response in (select result.* from mv_table1 result) loop
--for response in (select * from v_dynamic_database) loop
UTL_SMTP.write_data(response.data);
end loop;
你可以看到我在哪里注释掉了我尝试使用变量(我在这个上面的另一个循环中动态分配的 varchar)而不是官方 table 名称的地方,但是程序停止工作时我这样做。
有没有办法在for循环中动态修改数据库名称?
您可以将查询字符串作为游标打开并对其进行循环。在字符串中,您可以轻松地为 table 名称使用变量。
像这样:
DECLARE
v_cur sys_refcursor;
v_data varchar2(4000);
BEGIN
OPEN v_cur FOR 'select result.data from ' || mv_table1 || ' result';
loop
FETCH v_cur
INTO v_data;
EXIT WHEN v_cur%notfound;
UTL_SMTP.write_data(v_data);
END LOOP;
CLOSE v_cur;
END;
我正在 Oracle 数据库中开发一个脚本,最终会向有问题的用户发送电子邮件。我只想向用户发送一次电子邮件,并且需要动态引用一些物化视图才能这样做,否则将不得不编写大约 40 个不同的版本,我只需更改下面循环的 table 名称。
我有一个循环目前看起来像:
for response in (select result.* from mv_table1 result) loop
--for response in (select * from v_dynamic_database) loop
UTL_SMTP.write_data(response.data);
end loop;
你可以看到我在哪里注释掉了我尝试使用变量(我在这个上面的另一个循环中动态分配的 varchar)而不是官方 table 名称的地方,但是程序停止工作时我这样做。
有没有办法在for循环中动态修改数据库名称?
您可以将查询字符串作为游标打开并对其进行循环。在字符串中,您可以轻松地为 table 名称使用变量。
像这样:
DECLARE
v_cur sys_refcursor;
v_data varchar2(4000);
BEGIN
OPEN v_cur FOR 'select result.data from ' || mv_table1 || ' result';
loop
FETCH v_cur
INTO v_data;
EXIT WHEN v_cur%notfound;
UTL_SMTP.write_data(v_data);
END LOOP;
CLOSE v_cur;
END;