pl/sql 过程不允许将表名/视图名作为参数传递

Posted

技术标签:

【中文标题】pl/sql 过程不允许将表名/视图名作为参数传递【英文标题】:pl/sql procedure not allowing to pass table names/view names as parameters 【发布时间】:2014-08-21 13:46:46 【问题描述】:

我有一个 pl/sql 小程序,想在 12c 中运行,代码如下:

create or replace procedure p_ins_tbl(tbl_name in varchar2) as
begin 
execute immediate 'insert into ' ||tbl_name|| 'values(121,''asdfasdf'',6)' ;
end p_ins_tbl;

编译成功,

当我尝试使用执行它时:exec p_ins_tbl(countries);

我得到的错误是:

Error starting at line 6 in command:
exec p_ins_tbl(countries)
Error report:
ORA-06550: line 1, column 17:
PLS-00357: Table,View Or Sequence reference 'COUNTRIES' not allowed in this context
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

你有什么理由得到这个?如果是,程序是否有任何错误,请纠正我..提前谢谢。

【问题讨论】:

values 之前添加一个空格,如下所示:||tbl_name|| ' values(121,''asdfasdf'',6)' 【参考方案1】:

试试这个:

execute p_ins_tbl('countries');

【讨论】:

create or replace procedure crt_tbl_rpt(tbl_rpt in varchar2,tbl_cpy in varchar2) is begin execute immediate 'create table '||tbl_rpt|| 'as select * from '||tbl_cpy ; end crt_tbl_rpt; 当我将此过程称为:execute crt_tbl_rpt('dept_cpy','departments'); 时返回给我错误:你能告诉我为什么会这样吗?错误是:Error report: ORA-00922: missing or invalid option ORA-06512: at "HR.CRT_TBL_RPT", line 3 ORA-06512: at line 1 00922. 00000 - "missing or invalid option" 'create table '||tbl_rpt|| 'as select * from '||tbl_cpy ; 错了,'as 之间需要一个空格,否则就像create table dept_cpyas select... 下次创建一个新问题,我不想免费回答。

以上是关于pl/sql 过程不允许将表名/视图名作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

存储过程,将表名作为参数传递

Oracle函数:如何将表名作为参数传递,并使用游标结果作为表名?

每个将表名传递给过程的 ORACLE PL/SQL

如何动态地将表名传递给 PL SQL 游标?

如何将表名作为参数传递给存储过程?

在 MySQL 中:如何将表名作为存储过程和/或函数参数传递?