gpt4 book ai didi

oracle - PL/SQL 中的嵌套游标

转载 作者:行者123 更新时间:2023-12-04 23:22:01 25 4
gpt4 key购买 nike

我正在使用 Oracle PL/SQL。
我正在尝试定义嵌套游标,这意味着第一个游标的输出应该是第二个游标的输入。更具体地说:第一个应该存储带有特定前缀的表。第二个应该存储来自第一个表中所有表的属性的所有值。

这是我的代码片段。我希望它能让我的问题更清楚一点:

DECLARE
var_table_name VARCHAR2(30);
var_dimension_key VARCHAR2(30);

CURSOR cur_all_dim IS
SELECT
table_name
FROM dba_tables
WHERE dba_tables.tablespace_name = 'USERS'
AND dba_tables.owner = 'DWH_CORE'
AND UPPER (dba_tables.table_name) LIKE ('%DIM%%')
AND UPPER (dba_tables.table_name) NOT LIKE ('%TEMP%')
AND UPPER (dba_tables.table_name) NOT LIKE ('%DEBUG%')
AND UPPER (dba_tables.table_name) NOT LIKE ('%LOG%');

CURSOR cur_dimension_key IS
SELECT dimension_key FROM var_table_name;


BEGIN
OPEN cur_all_dim;

LOOP
EXIT WHEN cur_all_dim%NOTFOUND;

FETCH cur_all_dim INTO var_table_name;

OPEN cur_dimensions_key;
LOOP
EXIT WHEN cur_dimensions_key%NOTFOUND;
FETCH cur_dimensions_key INTO var_dimension_key;
dbms_output.put_line (var_table_name);
dbms_output.put_line (var_dimension_key);


END LOOP;
CLOSE cur_dimension_key;
END LOOP;
CLOSE cur_all_dim;
END;

最佳答案

静态游标只能访问静态对象。换句话说,只有在编译时已知所有表和列时,静态游标才起作用。

如果您需要访问其名称仅在执行期间才知道的表,则必须使用 dynamic SQL .例如,您可以使用 REF CURSOR 在你的情况下:

DECLARE
var_table_name VARCHAR2(30);
var_dimension_key VARCHAR2(30);
cur_dimension_key SYS_REFCURSOR;
BEGIN
FOR cur_all_dim IN (SELECT table_name
FROM dba_tables
WHERE dba_tables.tablespace_name = 'USERS'
AND dba_tables.owner = 'DWH_CORE'
AND UPPER(dba_tables.table_name) LIKE ('%DIM%%')
AND UPPER(dba_tables.table_name) NOT LIKE ('%TEMP%')
AND UPPER(dba_tables.table_name) NOT LIKE ('%DEBUG%')
AND UPPER(dba_tables.table_name) NOT LIKE ('%LOG%'))
LOOP
OPEN cur_dimension_key
FOR 'SELECT dimention_key
FROM ' || cur_all_dim.table_name;
LOOP
FETCH cur_dimensions_key INTO var_dimension_key;
EXIT WHEN cur_dimensions_key%NOTFOUND;
dbms_output.put_line(cur_all_dim.table_name);
dbms_output.put_line(var_dimension_key);
END LOOP;
CLOSE cur_dimension_key;
END LOOP;
END;

关于oracle - PL/SQL 中的嵌套游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com