在Oracle 10g中创建嵌套过程

时间:2013-07-23 07:07:21

标签: oracle plsql oracle10g

我想创建一个嵌套过程,在第一个过程中,我想用2列动态创建一个表,在第二个过程中,我想在该表中插入值。

以下是我尝试使用的代码;我做错了什么?

CREATE  or replace PROCEDURE mytable (tname varchar2)
is
stmt varchar2(1000);
begin
stmt := 'CREATE TABLE '||tname || '(sname varchar2(20) ,sage number (4))';
execute immediate stmt;
end;
create PROCEDURE mytable1 (emp_name varchar2,emp_age number,tname varchar2)
is
stmt1 varchar2(1000);
begin
stmt1 := 'insert into '||tname||' values ('Gaurav' ,27)';
execute immediate stmt1;
end;

1 个答案:

答案 0 :(得分:3)

此处无需创建嵌套过程。您可以在一个程序中完成所有工作。

请注意我在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的章节。


如果你真的觉得你这样做是一个嵌套的程序,它会是这样的;不要忘记在主要程序中调用嵌套过程,因为嵌套过程在第一个范围之外是不可见的。

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

上的文档