当前位置:网站首页>oracle存储过程中表名变量的异常
oracle存储过程中表名变量的异常
2022-08-08 10:36:00 【赵勇】
当前存储过程部分代码如下
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显示表名无效,这里应该怎么写?
其他答案1:
要用动态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做为入参。
其他答案2:
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;
其他答案3:
这个肯定涉及到了动态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;
边栏推荐
猜你喜欢
随机推荐
ASP.NET Core 2.0中,解决大文件上传配置问题
语音聊天app开发——对用户更具吸引力的设计
【数学知识】—— 质数/约数
文档数据库和列存储数据库有什么不同的嘛?
idea安装步骤
深度强化学习发展史
列存储数据库是什么呢?
「每周译Go」这次我们来点不一样的!--《How to Code in Go》系列上线
二、线性结构
键值数据库中可以对值进行查询嘛?
Service Mesh迁移原则
四、业务数据解析
Vulnhub靶机:GEMINI INC_ 1
PWA 应用 Service Worker 缓存的一些可选策略和使用场景
典型的NoSQL数据库有哪些呢?
人大金仓数据库登录、查看数据库
我用开天平台做了一个城市防疫政策查询系统【开天aPaaS大作战】
Kubernetes资源编排系列之四: CRD+Operator篇
关于振弦采集模块及采集仪振弦频率值准确率的问题
带你深入理解3.4.2的版本更新,对用户带来了什么?