暂无图片
oracle存储过程中表名变量的异常
我来答
分享
暂无图片 匿名用户
oracle存储过程中表名变量的异常

当前存储过程部分代码如下
1. for i in (select table_name,table_column from XXX) loop
2. v_table_name := i.table_name;
3. v_table_column := table_column;
4. for j in (select a,b,v_table_column from v_table_name) loop
5. ...
6. end loop;
7. end loop;
第四行这里v_table_name显示表名无效,这里应该怎么写?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
赵勇

要用动态SQL,拼接SQL。比如:
v_sql:=‘select a,b,’||v_table_column||’ from '||v_table_name;
execute immediate v_sql;

但你这里是for j in ,所以,也要改。需要对该行及其下的整段代码做动态处理。

另外,也可以考虑对这个部分再做一个存储过程(或函数),v_table_name和v_table_column做为入参。

暂无图片 评论
暂无图片 有用 1
文成

1. for i in (select table_name,table_column from XXX) loop
2. v_table_name := i.table_name;
3. v_table_column := i.table_column;
4. for j in (select a,b,v_table_column from v_table_name) loop
5. ...
6. end loop;
7. end loop;

暂无图片 评论
暂无图片 有用 0
DarkAthena

这个肯定涉及到了动态sql,但是和一般的动态sql有点区别,这里的动态sql字符串,需要作为一个游标,可以参考下面这个例子

declare l_sql varchar2(4000) := 'select * from dba_VIEWS a where a.VIEW_name IN (''DBA_TABLES'',''DBA_VIEWS'',''DBA_TAB_COLS'') '; l_row dba_VIEWS%rowtype; type r is record( a number, b number, c varchar2(200)); l_row2 r; type cur is ref cursor; curs cur; curs_2 cur; begin open curs for l_sql; loop fetch curs into l_row; exit when curs%notfound; open curs_2 for 'select 1 a,2 b,'''||l_row.VIEW_name||''' from ' || l_row.VIEW_name||' WHERE ROWNUM<=5'; loop fetch curs_2 into l_row2; exit when curs_2%notfound; dbms_output.put_line(l_row2.a||','||l_row2.b||','||l_row2.c); end loop; close curs_2; end loop; close curs; end;
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏