我想创建一个嵌套过程,在第一个过程中,我想用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;
答案 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
上的文档