这里不需要创建嵌套过程。您可以在一个过程中完成所有操作。
注意我在execute immediate statement中使用的绑定变量
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 的章节。
如果您真的觉得自己必须将其作为一个嵌套过程来执行,那么它看起来像这样;不要忘记在 main 中调用嵌套过程,因为嵌套过程在第一个范围之外是不可见的。
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 subprograms 上的文档