请教高手在存储过程中一个sql语句的用法。

lqh719 2003-04-14 10:48:49
select count(*) into recCount from T_ClassInfo;
recCount 是在存储过程中声明的一个变量;现在我想将T_ClassInfo也换作变量表示,如下所示:
select count(*) into recCount from tableName;



这个时候系统报错:Compilation errors for PROCEDURE AOSTAREIP.PRORULEIMPORT
Error: PLS-00201: 必须说明标识符 'tableName'
Line: 159
Text: select count(*) into recCount from tableName;

请问我该怎么做?

...全文
37 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lastdrop 2003-04-14
  • 打赏
  • 举报
回复
||是Oracle的连字符,用于字符串的拼接!

V_SQL := 'SELECT count(*) into recCount from '||tableName;
之后的
V_SQL就是SELECT count(*) into recCount from tableName(此时的tableName已是变量值!)
lqh719 2003-04-14
  • 打赏
  • 举报
回复
请教 developer2002(开发者2002) 兄和shuipipi(水皮皮) 兄,“||t_tablename”中“||”是用来干什么的?初学者,请勿见笑,谢谢!
shuipipi 2003-04-14
  • 打赏
  • 举报
回复
用动态SQL来执行就是了!

tableName :=‘T_ClassInfo’;

V_SQL := 'SELECT count(*) into recCount from '||tableName;

EXECUTE IMMEDIATE V_SQL ;
developer2002 2003-04-14
  • 打赏
  • 举报
回复
需要动态sql。
原因:在存储过程中,直接写from某张表,这张表在静态编译时被确定是否合法,若不合法,则报错。所以,你用变量名代替,系统认为是一个表名,在静态编译时到数据库中寻找这张表,这当然出错了。
8i及以上版本。可以用execute immediate 'sql string'。
execute immediate 'select count(*) from '||t_tablename into recCount;即可。
8i以下版本用dbms_sql包实现,相对烦琐。
rrxxpp 2003-04-14
  • 打赏
  • 举报
回复
这要用动态SQL不能简单的这样运行
lqh719 2003-04-14
  • 打赏
  • 举报
回复
在线等待,请高手不吝赐教!
Lastdrop 2003-04-14
  • 打赏
  • 举报
回复
用法是一样的,只不过是否借助中间变量而已。
lqh719 2003-04-14
  • 打赏
  • 举报
回复
developer2002(开发者2002) 兄和shuipipi(水皮皮) 兄的用法有些不同,这两种用法都正确吗?
beckhambobo 2003-04-14
  • 打赏
  • 举报
回复
create procedure name_pro(p_table in varchar2,p_count out number)
as
str varchar2(50);
begin
str:='select count(*) from '||p_table;
execute immediate str into p_count;
end;
/

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧