1

我想创建一个嵌套过程,在第一个过程中,我想动态创建一个包含 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;
4

1 回答 1

3

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

注意我在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 子程序的文档

于 2013-07-23T07:19:39.090 回答