2013-07-23 57 views
1

我想创建一个嵌套过程,其中在第一个过程中,我想创建一个具有2列的动态表,并且在第二个过程中,我想将值插入到该表中。在Oracle 10g中创建嵌套过程

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

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; 

回答

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; 

我会强烈建议阅读Guarding Against SQL Injection Oracle的篇章。


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

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; 

请参阅PL/SQL subprograms

+0

甲骨文的文档可你也告诉我如何同时呼吁从JDBC代码上面的程序输入值。 \t public String name; public String username public Integer age; \t公共字符串执行() \t \t {\t \t \t \t 连接CON; \t Statement stmt; \t ResultSet rs; \t Class.forName(“oracle.jdbc.driver.OracleDriver”); (“jdbc:oracle:thin:@localhost:1521:XE”,“Gaurav”,“oracle”); stmt = con.createStatement(); CallableStatement cs = con.prepareCall(begin mytable(....); end;); } – user2549572

+0

我很抱歉,自从我使用JDBC以来,我已经有一段时间了,现在我没有什么可以测试它的了......但有关于解析[so]语句中参数的其他问题。 – Ben