【问题标题】:Create nested procedure in Oracle 10g在 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;

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案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 不过。
    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2011-05-09
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多