无需在此处创建嵌套过程。您可以在一个程序中完成所有操作。
注意我在execute immediate
语句中使用绑定变量
create or replace procedure mytable (
Ptable_name in varchar2
, Pemp_name in varchar2
, Pemp_age in number
) is
begin
execute immediate 'create table ' || Ptable_name
|| ' (sname varchar2(20), sage number (4))';
execute immediate 'insert into ' || Ptable_name
|| ' values (:emp_name, :emp_age)'
using Pemp_name, Pemp_age;
end;
更一般地说,根本不需要使用execute immediate
;动态创建表表明数据库设计不佳。如果可能的话,不要这样做;提前创建表并有一个简单的过程来插入数据,如果你需要它:
create or replace procedure mytable (
, Pemp_name in varchar2
, Pemp_age in number
) is
begin
insert into my_table
values (Pemp_name, Pemp_age);
end;
我强烈推荐阅读 Oracle 的Guarding against SQL Injection一章。
如果您真的觉得必须将其作为嵌套过程执行,它看起来像这样;不要忘记在主过程中调用嵌套过程,因为嵌套过程在第一个范围之外是不可见的。
create or replace procedure mytable (
Ptable_name in varchar2
, Pemp_name in varchar2
, Pemp_age in number
) is
procedure myvalues (
Pemp_name in varchar2
, Pemp_age in number
) is
begin
execute immediate 'insert into ' || Ptable_name
|| ' values (:emp_name, :emp_age)'
using Pemp_name, Pemp_age;
end;
begin
execute immediate 'create table ' || Ptable_name
|| ' (sname varchar2(20), sage number (4))';
myvalues ( Pemp_name, Pemp_age);
end;
请参阅 Oracle 关于PL/SQL 子程序的文档