com.poscoict.glueframework.biz.activity
Class GlueJdbcNativeRun

java.lang.Object
  extended by com.poscoict.glueframework.biz.activity.GlueActivity<GlueContext>
      extended by com.poscoict.glueframework.biz.activity.GlueJdbcNativeRun

public class GlueJdbcNativeRun
extends GlueActivity<GlueContext>

dao를 통해서 PL/SQL를 실행하거나, SQL을 실행하는 Activity.

 
 본 Activity에서는 주어진 정보(table name 또는 procedure name)를 이용해서 실행하고자 하는 문장을 만든다. 
 - {call <procedure_name>(?,?} 형태의 프로시저 실행 문장
 - select * from <table_name> where constraint_column=? 형태의 sql 문장 
 이러한 문장은 다음과 같은 형태의 SQL 실행결과를 필요로 한다.
  
     <query id="oracle.procedure.arguments" desc="" resultType="" isNamed="true">
         <![CDATA[
 select a.OBJECT_ID, b.ARGUMENT_NAME as NAME, b.DATA_TYPE, b.IN_OUT, b.ARGUMENT_NAME||'abc' as SECOND_NAME
 from (select OBJECT_ID 
       from USER_OBJECTS 
       where OBJECT_NAME=:object_name ) a
 left outer join (select OBJECT_ID, ARGUMENT_NAME, DATA_TYPE, IN_OUT, SEQUENCE
                  from USER_ARGUMENTS 
                  where PACKAGE_NAME is null and OBJECT_NAME=:object_name ) b on a.OBJECT_ID=b.OBJECT_ID
 order by SEQUENCE
         ]]>
     </query>
 
     <query id="oracle.package.arguments" desc="" resultType="" isNamed="true">
         <![CDATA[
 select ARGUMENT_NAME as NAME, DATA_TYPE, IN_OUT
 from USER_ARGUMENTS
 where PACKAGE_NAME=:package_name
   and OBJECT_NAME=:object_name  
 order by SEQUENCE
         ]]>
     </query>
 
     <query id="oracle.table.primary.key" desc="" resultType="" isNamed="true">
         <![CDATA[
 select A.COLUMN_NAME as NAME, A.DATA_TYPE, B.CONSTRAINT_TYPE, C.CONSTRAINT_TYPE as NULLABLE 
 from ( select COLUMN_NAME, DATA_TYPE, COLUMN_ID 
        from USER_TAB_COLUMNS
        where TABLE_NAME=:table_name ) A
 left outer join ( select B1.COLUMN_NAME, B2.CONSTRAINT_TYPE
                   from ( select COLUMN_NAME, CONSTRAINT_NAME 
                          from USER_CONS_COLUMNS
                          where TABLE_NAME=:table_name ) B1
                   inner join (select CONSTRAINT_NAME, CONSTRAINT_TYPE
                               from USER_CONSTRAINTS
                               where TABLE_NAME=:table_name
                                 and CONSTRAINT_TYPE='P' ) B2
                   on B1.CONSTRAINT_NAME=B2.CONSTRAINT_NAME ) B
 on A.COLUMN_NAME = B.COLUMN_NAME
 left outer join ( select C1.COLUMN_NAME, C2.CONSTRAINT_TYPE
                   from ( select COLUMN_NAME, CONSTRAINT_NAME 
                          from USER_CONS_COLUMNS
                          where TABLE_NAME=:table_name ) C1
                   inner join (select CONSTRAINT_NAME, CONSTRAINT_TYPE
                               from USER_CONSTRAINTS
                               where TABLE_NAME=:table_name
                                 and CONSTRAINT_TYPE='C' ) C2
                   on C1.CONSTRAINT_NAME=C2.CONSTRAINT_NAME ) C
 on A.COLUMN_NAME = C.COLUMN_NAME
         ]]>
     </query>
 
 
 
 
 사용 예
 - case 1 :
 <activity name="RunProcedure" class="com.poscoict.glueframework.biz.activity.GlueJdbcNativeRun">
     <property name="dao" value="testdao" />
     <property name="sql-key" value="oracle.procedure.arguments" />
     <property name="procedure-name" value="proc1" />
     <transition name="success" value="end" />
 </activity>
 ==>
      oracle.procedure.arguments(sql-key) 실행결과(NAME/DATA_TYPE/IN_OUT/SECOND_NAME 순) 가 다음과 같을 경우  
            /      / IN  / 
      --> {call proc1( )} 문을 실행함.
      
      oracle.procedure.arguments(sql-key) 실행결과(NAME/DATA_TYPE/IN_OUT/SECOND_NAME 순) 가 다음과 같을 경우  
      P_INPUT1  / VARCHAR2    / IN      / INPUT1
      P_INPUT2  / NUMBER      / IN/OUT  / INPUT2
      P_OUTPUT  / NUMBER      / OUT     / OUTPUT
      --> {call proc1( ?,? )} 문을 실행함.
      --> bind에 사용되는 data 2개는 GlueContext에서 SECOND_NAME(null일 경우 NAME)를 key로 해서 획득함. 
      --> GlueContext에 2개의 결과값 추가함. GlueContext의 key는 SECOND_NAME(null일 경우 NAME)이 사용됨
 
 
 
 
 
 - case 2 :
 <activity name="RunPackage" class="com.poscoict.glueframework.biz.activity.GlueJdbcNativeRun">
     <property name="dao" value="testdao" />
     <property name="sql-key" value="oracle.package.arguments" />
     <property name="procedure-name" value="biz1.sub1" />
     <transition name="success" value="end" />
 </activity>
 ==>
      oracle.procedure.arguments(sql-key) 실행결과(NAME/DATA_TYPE/IN_OUT/SECOND_NAME 순) 가 다음과 같을 경우  
            /      / IN  / 
      --> {call biz1.sub1( )} 문을 실행함.
      
      oracle.procedure.arguments(sql-key) 실행결과(NAME/DATA_TYPE/IN_OUT/SECOND_NAME 순) 가 다음과 같을 경우  
      P_INPUT1  / VARCHAR2    / IN      /  
      P_INPUT2  / NUMBER      / IN/OUT  /  
      P_OUTPUT  / NUMBER      / OUT     /  
      --> {call biz1.sub1( ?,? )} 문을 실행함.
      --> bind에 사용되는 data 2개는 GlueContext에서 SECOND_NAME(null일 경우 NAME)를 key로 해서 획득함. 
      --> GlueContext에 2개의 결과값 추가함. GlueContext의 key는 SECOND_NAME(null일 경우 NAME)이 사용됨
 
 
 
 
 
 - case 3 :
 <activity name="RunPackage" class="com.poscoict.glueframework.biz.activity.GlueJdbcNativeRun">
     <property name="dao" value="testdao" />
     <property name="sql-key" value="oracle.package.arguments" />
     <property name="procedure-name" value="biz1.sub1" />
     <property name="name-bindings" value="P_INPUT1=a|P_OUTPUT=result" />
     <transition name="success" value="end" />
 </activity>
 ==>
      oracle.procedure.arguments(sql-key) 실행결과(NAME/DATA_TYPE/IN_OUT/SECOND_NAME 순) 가 다음과 같을 경우  
            /      / IN  / 
      --> {call biz1.sub1( )} 문을 실행함.
      
      oracle.procedure.arguments(sql-key) 실행결과(NAME/DATA_TYPE/IN_OUT/SECOND_NAME 순) 가 다음과 같을 경우  
      P_INPUT1  / VARCHAR2    / IN      /  
      P_INPUT2  / NUMBER      / IN/OUT  /  
      P_OUTPUT  / NUMBER      / OUT     /  
      --> {call biz1.sub1( ?,? )} 문을 실행함.
      --> bind에 사용되는 data 2개는 GlueContext에서 가져올때 사용되는 key는 name-bindings에 근거함 
             ctx.get("a") : P_INPUT1 이 아닌 a를 key로 함.
             ctx.get("P_INPUT2") : name-bindings에 P_INPUT2가 없으므로 실행결과 NAME이 사용됨.
      --> GlueContext에 2개의 결과값 추가함. GlueContext의 key는 name-bindings에 근거함.
             ctx.put("P_INPUT2", obj1) : name-bindings에 P_INPUT2가 없으므로 실행결과 NAME이 사용됨.
             ctx.put("result", obj2) :  : P_OUTPUT 이 아닌 result를 key로 함.
 
 
 
 
 
 
 Property 설정
 - dao : (필수) applicationContext.xml의 DAO id.
 
 - sql-key : (필수) xxx-query.glue_sql의 query id 
        유형에 맞는 query를 지정해야 하며, query 실행결과에 따라 Statement 실행 구문이 만들어짐.
        sql은 named query여야 하며, :table_name, :object_name, :package_name, :owner만 named parameter로 사용한다. 
        ex) oracle 의 경우 다음 3가지 유형에 맞는 SQL 이 필요함.
            1. procedure 실행
                -> {call package.procedure(:arg, :arg, ...)}
            2. package 실행
                ->  {call procedure(:arg, :arg, ...)}
            3. table 정의 정보에 기반한 sql 실행
                -> select * from table where column_pk = :column and ...
                -> insert into table(column, ...) values (:column, ...)
                -> delete from table where column_pk = :column and ...
                -> update talbe set column=:column, ... where column_pk = :column and ...
                   
 - procedure-name : (필수) 실행하고자 하는 PL/SQL 프로시저 또는 패키지 이름. table-name 과 같이 사용할 수 없음.
             sql-key에 해당하는 query를 실행한 결과항목(oracle.procedure.arguments, oracle.package.arguments 참고)
              - 필수 : NAME, DATA_TYPE, IN_OUT 항목을 포함해야함.
              - 선택 : SECOND_NAME 항목은 name을 가공한 값임.
             sql상의 :package_name 과 :object_name 의 값으로 사용됨.
              - aaa.bbb 형태일경우 경우 :package_name으로 aaa 를 :object_name에는 bbb 를 그 값으로 bind함.
              - ccc 형태일 경우 :object_name 에 ccc 를 그 값으로 bind함.
             실행결과는 IN/OUT 과 OUT 유형에 대해.. <argument_name>_result 로 GlueContext에 담김.
 
 - table-name : (필수) table 명. procedure-name 과 같이 사용할 수 없음.
             sql-key에 해당하는 query를 실행한 결과 항목(oracle.table.primary.key 참고) 
               - 필수 NAME, DATA_TYPE, CONSTRAINT_TYPE 을 포함해야함.
               - 선택 : NULLABLE 항목은 sql 실행시 bind되는 값의 null check해당 항목인지 판단함..
             sql상의 :table_name 의 값으로 사용됨.
 
 - table-sql : (선택) sql 처리 유형. default는 select임. 
             - select : PK(UK)를 조건으로 select 수행. 조회 결과는 <table-name>_resultList 으로 GlueContext에 담김.
             - insert : insert 수행. 등록 결과는 <table-name>_result 로 GlueContext에 담김.
             - update : PK(UK)를 조건으로 update 수행. 수정 결과는 <table-name>_result 로 GlueContext에 담김.
             - delete : PK(UK)를 조건으로 delete 수행. 삭제 결과는 <table-name>_result 로 GlueContext에 담김.
             - save : PK(UK)를 조건으로 select 수행하고 그 결과 따라 insert or update 수행. 저장 결과는 <table-name>_result 로 GlueContext에 담김.
             - desert : delete and insert 수행. 등록 결과는 <table-name>_result 로 GlueContext에 담김.
             
 - owner : (선택) : owner 정보.. 
             oarcle 사용시 sql-key에 해당하는 query에서
             user_arguments가 아닌 all_arguments를 사용할 경우 owner 정보를 지정할 수 있음.
             sql상의 :owner 의 값으로 사용됨.
  
 - name-bindings : (선택) mapping 정보로 name=ctxKey[|name=ctxKey...] 형태임. 
            parocedure-name이 사용된 경우는 argumentName=ctxKey|argumentName=ctxKey 의미로 사용함
            table-name이 사용된 경우는 columnName=ctxKey|columnName=ctxKey 의미로 사용함.
 
 - name-values : (선택) mapping 정보로 name=constants[|name=constants...] 형태임. 
            parocedure-name이 사용된 경우는 argumentName=constant|argumentName=constant 의미로 사용함
            table-name이 사용된 경우는 columnName=constants|columnName=constants 의미로 사용함.
            - null 값일 경우 'name' 만 입력 할 것
            - empty string 일 경우 'name=' 만 입력 할 것
            - space 일 경우 'name= ' 만 입력 할 것
                 ==>  'a|b=|c= |d=value' 형태가 될 것임. 
            name-bindings와 name-values의 우선순위는 name-values 를 우선으로 함.
 
 - chk-name : (선택) 화면의 CheckBox ID(HttpRequest의 parameter name).
         <property name="chk-name" value="chk" /> 와 같이 "chk" 가 선언 되어 있다면,
         <input type="checkbox" name="chk">의 value 값에 따라 Looping 처리를 한다.
         chk의 value는 0,1,2...,n 으로 부여되며 checked 된 값만 Context에 담긴다.
 
 - list-key : (선택) Binding 할 Data Context Key.
         <property name="list-key" value="dataList" /> 와 같이 "dataList" 가 선언 되어 있다면,
         이전 Activity에서 List(Map<name, value>) 구조의 Data를 생성해서 Context에 담는다.
         [ sample java code ] 
             List dataList = new ArrayList();
             Map data1 = new HashMap();
             data1.put("EMPNO","1111");
             dataList.add(data1);
             Map data2 = new HashMap();
             data2.put("EMPNO","2222");
             dataList.add(data2);
             ctx.put("dataList",dataList);
 
 


Field Summary
 
Fields inherited from class com.poscoict.glueframework.biz.activity.GlueActivity
dynamicProperties, logger
 
Constructor Summary
GlueJdbcNativeRun()
           
 
Method Summary
static void main(String[] args)
           
 String runActivity(GlueContext ctx)
          Sub Class에서 반드시 구현하여야 하는 Abstract Method 이며 이 Method는 F/W에서 호출한다.
 
Methods inherited from class com.poscoict.glueframework.biz.activity.GlueActivity
commitTransaction, getDao, getEventList, getName, getProperty, getPropertyNames, getTransition, rollbackTransaction, setEventList, setName, setProperty, setTransition
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

GlueJdbcNativeRun

public GlueJdbcNativeRun()
Method Detail

runActivity

public String runActivity(GlueContext ctx)
Description copied from class: GlueActivity
Sub Class에서 반드시 구현하여야 하는 Abstract Method 이며 이 Method는 F/W에서 호출한다. 결과 값은 GlueContext에 담아서 다음 Activity 또는 F/W에 전달하게 된다. 필요한 모든 Data는 GlueContext에서 호출하여 사용하게 된다.

Specified by:
runActivity in class GlueActivity<GlueContext>
Parameters:
ctx - GlueContext
Returns:
String 정상적이면 "success"를 Return 하고 비정상 처리를 원하면 "failure"를 Return 한다.
 예) 
 <transition name="success" value="BizLogic"/>
 <transition name="failure" value="ErrorHandle"/>
 ==> return "success"이면 BizLogic Activity 를 실행함.
 

main

public static void main(String[] args)


Copyright © 2013–2014 POSCO ICT SW제품기술팀. All rights reserved.