use*_*656 4 oracle plsql nested cursor
我正在使用Oracle PL/SQL.我试图定义嵌套游标,这意味着第一个Cursor的输出应该是第二个Cursor的输入.更具体一点:第一个应该存储具有特定前缀的表.第二个应该存储来自第一个表中所有表的属性的所有值.
这是我的代码片段.我希望它能让我的问题更加清晰:
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;
Run Code Online (Sandbox Code Playgroud)
静态游标只能访问静态对象.换句话说,只有在编译时知道所有表和列时,静态游标才起作用.
如果需要访问其名称仅在执行期间已知的表,则必须使用动态SQL.例如,您可以REF CURSOR在您的情况下使用a :
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32692 次 |
| 最近记录: |