2013-07-23 54 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