在 Oracle 10g 中创建嵌套过程

Posted

技术标签:

【中文标题】在 Oracle 10g 中创建嵌套过程【英文标题】:Create nested procedure in Oracle 10g 【发布时间】:2013-07-23 07:07:21 【问题描述】:

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

这里不需要创建嵌套过程。您可以在一个过程中完成所有操作。

注意我在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 上的文档

【讨论】:

您能否告诉我在从 jdbc 代码调用上述过程时如何输入值。公共字符串名称;公共字符串用户名公共整数年龄;公共字符串执行()连接con;语句 stmt;结果集rs; Class.forName("oracle.jdbc.driver.OracleDriver"); con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","Gaurav","oracle"); stmt=con.createStatement(); CallableStatement cs = con.prepareCall (begin mytable(....); end; ); 很抱歉,自从我使用 JDBC 以来已经有一段时间了,目前我没有什么可以测试它...关于解析参数的语句中还有其他问题Stack Overflow 不过。

以上是关于在 Oracle 10g 中创建嵌套过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中创建记录和该记录的表?

如何在oracle10G中创建表空间

无法调用oracle存储过程和函数

如何将 Forms 10g 中创建/修改的 Form(FMB) 降级为 Oracle Forms 9

Oracle 10g中如何创建表

Oracle 10g中如何创建表