我想运行查询,获取结果,然后使用第二个语句(游标)中第一个语句的值,使用另一个select语句迭代该查询的结果.
我的数据库中有40个用户.所有用户都具有相同的数据库架构结构.我想通过以下方式获取用户名:
SELECT distinct username
from all_users
Run Code Online (Sandbox Code Playgroud)
然后使用用户名运行如下查询:
Select lastname, firstname, email, email2 from username.member.
Run Code Online (Sandbox Code Playgroud)
我的结果集将返回多行,所以我也需要一个行类型.
我尝试了很多不同的pl/sql组合:
DECLARE
CURSOR client_cur IS
SELECT distinct username
from all_users
where length(username) = 3;
-- client cursor
CURSOR emails_cur (cli all_users.username%TYPE) IS
SELECT id, name
FROM cli.org;
BEGIN
FOR client IN client_cur LOOP
dbms_output.put_line('Client is '|| client.username);
FOR email_rec in client_cur(client.username) LOOP
dbms_output.put_line('Org id is ' ||email_rec.id || ' org nam ' || email_rec.name);
END LOOP;
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)
和
DECLARE
CURSOR c1 IS
SELECT distinct username from all_users where length(username) = 3;
client c1%rowtype;
cursor c2 is Select id, name, allow_digest_flg from c1.username.org;
digest c2%rowtype;
-- declare record variable that represents a row fetched from the employees table
-- employee_rec c1%ROWTYPE;
BEGIN
-- open the explicit cursor and use it to fetch data into employee_rec
OPEN c1;
loop
FETCH c1 INTO client;
open c2;
loop
fetch c2 into digest;
DBMS_OUTPUT.PUT_LINE('digest is : ' || c2.id || ' and name is ' || c2.name || ' flg is ' || c2.allow_digest_flg );
end loop;
end loop;
END;
/
Run Code Online (Sandbox Code Playgroud)
这些和其中的许多变化.
有人能帮我吗.谢谢
您需要使用动态SQL来实现此目的; 就像是:
DECLARE
TYPE cur_type IS REF CURSOR;
CURSOR client_cur IS
SELECT DISTING username
FROM all_users
WHERE length(username) = 3;
emails_cur cur_type;
l_cur_string VARCHAR2(128);
l_email_id <type>;
l_name <type>;
BEGIN
FOR client IN client_cur LOOP
dbms_output.put_line('Client is '|| client.username);
l_cur_string := 'SELECT id, name FROM '
|| client.username || '.org';
OPEN emails_cur FOR l_cur_string;
LOOP
FETCH emails_cur INTO l_email_id, l_name;
EXIT WHEN emails_cur%NOTFOUND;
dbms_output.put_line('Org id is ' || l_email_id
|| ' org name ' || l_name);
END LOOP;
CLOSE emails_cur;
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)
编辑纠正两个错误,并添加10g文档的链接OPEN-FOR
和示例.
编辑使内部游标查询字符串变量.