循环oracle pl/sql中的表名
Posted
技术标签:
【中文标题】循环oracle pl/sql中的表名【英文标题】:table name in loop oracle pl/sql 【发布时间】:2015-05-07 06:48:48 【问题描述】: declare
v_cnt NUMBER;
C SYS_REFCURSOR;
TMP_TBL_NM VARCHAR2(100);
stmt VARCHAR2(1000);
the_name varchar2 (50);
cursor c_table is
(SELECT a.table_name
--, a.column_name, a.constraint_name, c.owner,
--c.r_owner , c_pk.table_name r_table_name, c_pk.constraint_name r_pk
FROM all_cons_columns a
JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk ON c.r_owner = c_pk.owner AND c.r_constraint_name = c_pk.constraint_name
WHERE c.owner like '%LTR' and c_pk.table_name like '%EnumerationValue%');
begin
stmt := 'SELECT table_name FROM ' || TMP_TBL_NM || ' ORDER BY 1';
OPEN C FOR stmt;
for t in C
loop
FETCH C INTO the_name;
EXIT WHEN C%NOTFOUND;
--my query for each table goes here
end loop;
end;
我想在循环中使用表名来根据我的查询检查记录。 仅通过在循环中获取表名才给我错误。 如何在循环中获取表名,以便我可以根据我的要求从循环中的每个表中获取行。
提前致谢。
【问题讨论】:
TMP_TBL_NM 显然没有在任何地方定义 已编辑.. 仍然出现错误 getting error 不是可接受的标准 Oracle 错误。向我们展示错误。 ORA-06550:第 18 行,第 18 列:PLS-00221:'C' 不是过程或未定义 ORA-06550:第 18 行,第 9 列: TMP_TBL_NM 显然没有在任何地方被赋值 【参考方案1】:我不完全确定你想在这里实现什么,但如果只是你感兴趣的表名,你可以通过这种方式让你的代码不那么复杂:
declare
cursor c_table is
SELECT a.table_name
--, a.column_name, a.constraint_name, c.owner,
--c.r_owner , c_pk.table_name r_table_name, c_pk.constraint_name r_pk
FROM all_cons_columns a
JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk ON c.r_owner = c_pk.owner AND c.r_constraint_name = c_pk.constraint_name
begin
for t in c_table loop
--do something with the table name
dbms_output.put_line(t.table_name);
end loop;
end;
这种 for 循环还处理光标的打开和关闭,是执行此类操作的推荐方式。
【讨论】:
以上是关于循环oracle pl/sql中的表名的主要内容,如果未能解决你的问题,请参考以下文章
oracle 11g 中 for 循环中的 PL/SQL 限制
如何使用 pl/sql 中的游标将多列数据插入包含单列的表中?