2013-07-23 3 views
1

중첩 된 프로 시저를 만들려면 첫 번째 프로 시저에서 두 개의 열을 사용하여 동적으로 테이블을 만들고 두 번째 프로 시저에서 해당 테이블에 값을 삽입하고 싶습니다.오라클 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을 사용할 필요가 없습니다, 더 일반적으로 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; 

에서 바인드 변수의 내 사용을 참고; 즉석에서 테이블을 만드는 것은 잘못 설계된 데이터베이스를 나타냅니다. 가능하다면 이것을하지 마십시오. 당신이 그것을 필요로 할 경우, 사전에 테이블을 만들고 데이터를 삽입하는 간단한 방법이 있습니다

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에 오라클의 장을 읽기 추천 할 것입니다.


당신이 정말 같을 것이다 중첩 된 절차로이 작업을 수행이 당신처럼 느끼는 경우; 중첩 된 프로 시저가 첫 번째 범위 외부에서 보이지 않으므로 주 메뉴에서 중첩 된 프로 시저를 호출하는 것을 잊지 마십시오.

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; 

당신은 또한 어떻게 JDBC 코드에서 위의 프로 시저를 호출하면서 값을 입력하는 말해 줄 수 PL/SQL subprograms

+0

에 오라클의 설명서를 참조하십시오. \t public String name; 공용 문자열 사용자 이름 public 정수 나이입니다. \t 공공 문자열) ( \t {\t \t \t \t \t 연결 콘을 실행; \t 성명 stmt; \t ResultSet rs; \t Class.forName ("oracle.jdbc.driver.OracleDriver"); \t con = DriverManager.getConnection ("jdbc : oracle : thin : @localhost : 1521 : XE", "Gaurav", "oracle"); stmt = con.createStatement(); CallableStatement cs = con.prepareCall (시작 mytable (....); 끝;); } – user2549572

+0

죄송 합니다만 JDBC를 사용한 이래로 오랜 시간이 걸렸습니다. 지금은 테스트 할 항목이 없습니다 ... 매개 변수를 구문 분석하는 것과 관련하여 다른 질문이 있습니다. – Ben