창원지역 고객을 위한 오라클 세미나

안녕하세요? 창원,마산,거제 지역 고객을 위한 오라클 세미나에 초대합니다. 5월10일 CGV창원 더 시티에서 개최되는 이번 세미나에서는,차세대 애플리케이션 구축, 비즈니스 안정성 및 실시간 분석 실현, 클라우드의 실현 등귀사에서 고민하시고 계신 IT 및 비즈니스 이슈에 대한 제안을 드리고자 합니다. 오라클 세미나에서 최근의 IT 이슈와 솔루션을 접하시고 최신 개봉영화 <어벤져스>를 관람하실 수 있는 기회가 되시길 바랍니다. 바쁘시더라도 부디 참석하셔서 유용하고 뜻 깊은 시간 되시길 바랍니다. More »

This is default featured slide 2 title

You can completely customize the featured slides from the theme theme options page. You can also easily hide the featured posts slideshow from certain parts of your site like: categories, tags, archives etc. More »

This is default featured slide 3 title

You can completely customize the featured slides from the theme theme options page. You can also easily hide the featured posts slideshow from certain parts of your site like: categories, tags, archives etc. More »

This is default featured slide 4 title

You can completely customize the featured slides from the theme theme options page. You can also easily hide the featured posts slideshow from certain parts of your site like: categories, tags, archives etc. More »

This is default featured slide 5 title

You can completely customize the featured slides from the theme theme options page. You can also easily hide the featured posts slideshow from certain parts of your site like: categories, tags, archives etc. More »

 

Oracle Object 소스에 한글이 포함된 라인 찾기

Oracle EBS를 사용하여 이미 구축되거나 개발 완료된 소스를 타 사이트로 이관하여 구축하는 프로젝트를 가끔 하게 됩니다.
그 중에서 국내에서 구축된 사이트의 소스를 가지고, 해외 사이트의 법인으로 ROLL-OUT 하게 될 경우에 소스상의 한글 문자열을 찾아내어 변경해주는 작업이 필요합니다.

 FORM 소스에서 한글이 포함된 경우를 찾기는 쉽지 않습니다.
다만, Oracle Object 소스의 경우엔 그나마 쿼리를 실행할 수 있으니 PL/SQL 로 아래와 같이 만들어 봤습니다.
이 소스가 변경해야 할 한글 문자열만 골라내어 주는데 완벽하지는 않습니다만 그래도 어느정도 한 번 걸러낸 다음에 다시 한번 찾아보는 것이 조금이나마 더 쉽지 않을까 합니다.

DECLARE
 
    v_char         VARCHAR2(10000);
    v_include_flag VARCHAR2(1);
 
BEGIN
 
    FOR i IN (
 
              SELECT NAME
                     ,line
                     ,TRIM(text) text
              FROM   all_source
              WHERE  NAME LIKE 'ZMFG_QM%' -- 모듈 네이밍 룰
              AND    TRIM(text) IS NOT NULL -- 빈줄 제외
              AND    TRIM(text) <> CHR(10) -- 리턴문자 제외
              AND    SUBSTR(TRIM(text), 1, 2) NOT IN ('--', '/*') -- 주석줄 제외
              ORDER  BY owner
                        ,NAME
                        ,TYPE
                        ,line)
 
    LOOP
        v_include_flag := NULL;
 
        FOR j IN 1 .. LENGTH(i.text)
        LOOP
            v_char := SUBSTR(i.text, j, 1);
 
            IF v_char >= 'ㄱ' AND v_char <= '핿' THEN
                v_include_flag := 'Y';
                EXIT;
            ELSE
                v_include_flag := 'N';
            END IF;
 
        END LOOP;
 
        IF v_include_flag = 'Y' THEN
 
            INSERT INTO zmfg_temp
            VALUES
                (i.name
                ,i.line
                ,i.text);
 
        END IF;
 
    END LOOP;
 
    COMMIT;
 
END;

위 PL/SQL 문을 사용하여 실행을 한 후에
zmfg_temp 테이블을 SELECT 하시면, 한글이 포함된 소스를 확인하 실 수 있습니다.

 혹시나, 더 좋은 방법 있으면 공유 부탁드립니다.

작성 : amagrammer / 편집 : amagrammer

Windows 7 Service Pack 백업 파일 삭제

다음 글을 통해 Windows OS별 Service Pack 백업 파일 삭제하는 법을 정리하였습니다.
http://oracleebs.co.kr/index.php/archives/40

이후 Windows 7 OS 에 대해서도 서비스팩1 이 나왔습니다.
이전 글에서도 썼지만 서비스팩은 설치 후에는 삭제할 일이 없기 때문에, 설치 후 불필요한 백업 파일을 삭제하여 HDD의 공간을 확보하는 것이 좋을 듯 합니다.

Windows 7의 경우에는

dism /online /cleanup-image /spsuperseded

를 명령프롬프트 창에서 실행해 주면 됩니다.

물론, Windows 7 SP1 통합본으로 OS를 설치한 경우라면 서비스팩1의 백업 파일을 삭제할 필요는 없을 것입니다.

작성 : amagrammer / 편집 : amagrammer

ERP 권한(Responsibility) 부여

Standard Form 을 사용하지 않고, 사용자에 대한 권한을 부여 혹은 회수할 수 있는 프로그램을 개발할 때 유용하게 사용할 수 있는 API 를 소개할까 합니다.

fnd_user_resp_groups_api.Insert_Assignment(  )

--
-- Insert_Assignment
--   Insert a new user/resp/group assignment
-- IN
--   user_id - User to get assignment
--   responsibility_id - Responsibility to be assigned
--   responsibility_application_id - Resp Application to be assigned
--   security_group_id - Security Group to be assigned
--   start_date - Start date of assignment
--   end_date - End date of assignment
--   description - Optional comment
-- EXCEPTION
--   If user/resp/group assignment already exists
--
BEGIN
fnd_user_resp_groups_api.Insert_Assignment (
   user_id =>&USER_ID ,
   responsibility_id => &RESP_ID,
   responsibility_application_id =>&APPL_ID,
   start_date => &START_DATE,
   end_date => &END_DATE,
   description =>'Sample example' );
COMMIT;
END;

fnd_user_pkg.addresp(  )

--
-- AddResp (PUBLIC)
--   For a given user, attach a valid responsibility.
--   If user name or application short name or responsbility key name
--   or security group key is not valid, exception raised with error message.
--
-- Usage example in pl/sql
--   begin fnd_user_pkg.addresp('SCOTT', 'FND', 'APPLICATION_DEVELOPER',
--                              'STANDARD', 'DESCRIPTION', sysdate, null); end;
-- Input (Mandatory)
--  username:       User Name
--  resp_app:       Application Short Name
--  resp_key:       Responsibility Key
--  security_group: Security Group Key
--  description:    Description
--  start_date:     Start Date
--  end_date:       End Date
--
BEGIN
fnd_user_pkg.addresp(
     '&User_Name',
     '&Responsablity_Application_Short_Name',
     '&Responsibility_Key',
     '&Security_Group',
     '&Description',
     '&Start_Date',
     '&End_Date' );
COMMIT;
END;

fnd_user_pkg.delresp(  )

--
-- DelResp (PUBLIC)
--   Detach a responsibility which is currently attached to this given user.
--   If any of the username or application short name or responsibility key or
--   security group is not valid, exception raised with error message.
--
-- Usage example in pl/sql
--   begin fnd_user_pkg.delresp('SCOTT', 'FND', 'APPLICATION_DEVELOPER',
--                              'STANDARD'); end;
-- Input (Mandatory)
--  username:       User Name
--  resp_app:       Application Short Name
--  resp_key:       Responsibility Key
--  security_group: Security Group Key
--
BEGIN
fnd_user_pkg.delresp(
     '&User_Name',
      '&Responsibility_application_short_name',
      '&Responsibility_Key',
      '&Security_Group');
COMMIT;
END;

프로그램 이름만 봐도 어떤 기능을 수행하는 것인지 알 수 있을 듯 합니다. 그래서 자세한 설명은 해당 Package 의 주석을 그대로 가져왔습니다.
P00652  사용자에  ‘Arch-설비 관리 슈퍼 사용자 ‘  권한을 부여하는 것으로 테스트를 하였는데, 그 결과를 소개하자면 

SELECT *
FROM fnd_user
WHERE user_name = 'P00652';
 
SELECT *
FROM fnd_application
WHERE application_short_name IN ( 'MFG', 'WIP');
 
SELECT *
FROM fnd_responsibility fr
WHERE application_id =
AND responsibility_key = ;
 
SELECT *
FROM fnd_security_groups fss
WHERE security_group_key = 'STANDARD';
 
SELECT *
FROM fnd_responsibility fr
WHERE responsibility_key LIKE 'Arch%'
AND RESPONSIBILITY_ID=52754; --Arch-설비 관리 슈퍼 사용자 / ARCH-STX_EAM_SUB6 /
위와 같은 쿼리문을 사용하여, user_id, responsibility_id, responsibility_application_id 등을 쿼리 하여 온 후 해당 API 에 대입하여 실행하면, 아래 그림과 같이 정상적으로 권한이 부여되는 것을 확인 할 수 있습니다.
responsibility다른 API 들도 쉽게 테스트 해보실 수 있을 듯 합니다. 소개한 두개의 Package 에는 사용자와 권한에 관련된 다른 유용한 API 들도 있으니, 한번 살펴보시면 좋을 듯 합니다.

 

작성 : 박경채 / 편집 : amagrammer

JSP로 ERP에 File Attachments

Oracle ERP 스탠다드 화면에는 File 첨부기능을 이용할 수 있는 화면이 있습니다. 이 File Attachments 기능을 사용하여 개발 폼에도 파일 첨부기능을 활용할 수 있도록 지원을 하고 있습니다.

하지만, 외부 프로그램을 통하여 Oracle ERP 로 Interface 될 경우, 첨부파일도 함께 Interface 되어야 하는 경우가 생길 수 있는데, 이때 JSP 로 구현된 프로그램에서 ERP 내의 파일 첨부에 관여하는 Table 들에 대해 Insert 될 수 있도록 구현된 Sample 프로그램을 소개 합니다.

물론, Interface 일때만 필요한 것이 아니라, JSP 로 구현된 다른 프로그램에서 직접 ERP로 파일을 첨부하기 위해서 사용해도 됩니다.

소스내에 주석이 도움이 될 듯 하니 자세한 설명은 생략합니다.

<%@ page import = "java.io.*" %>
<%@ page import = "java.sql.*" %>
<%@ page import = "javax.activation.MimetypesFileTypeMap" %>
<%@ page import = "com.stx.common.interfaces.DBConnect" %>
 
<%
 
    String errMsg = "";
 
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    OutputStream outstream  = null;
    FileInputStream finstream  = null;
 
    try
    {
        String sId_fnd_lobs = "638484"; // select fnd_lobs_s.nextval from fnd_lobs
        String sId_document_id = "122181826"; // select fnd_documents_s.nextval from dual
        String sId_ATTACHED_DOCUMENT_ID = "122330159"; // select fnd_attached_documents_s.nextval from fnd_attached_documents
 
        String fileName = "20100112_연차사용촉진 공지.XLS"; // DB에 Insert할 파일명 (테스트를 위해 임의로 지정)
        // *** 파일명에 '&' 등 문자가 포함되어 있으면 변경해야 함
        System.out.println("fileName = " + fileName);
 
        // FILE
        File file = new File("C:\\Interstage\\J2EE\\var\\deployment\\ijserver\\ematrix\\apps\\ematrix\\stxcentral\\" + fileName);
        System.out.println("file ok.......");
 
        // DB Connection
        conn = DBConnect.getDBConnection("ERP_APPS");
        System.out.println("db connected.......");
 
        /* 1. fnd_lobs ********************************************************/
 
        // INSERT
        String sSql = "insert into fnd_lobs ";
        sSql += "(FILE_ID, FILE_NAME, FILE_CONTENT_TYPE, UPLOAD_DATE, PROGRAM_NAME, LANGUAGE, ORACLE_CHARSET, FILE_FORMAT) ";
        sSql += "values(" + sId_fnd_lobs + ", '" + fileName + "', '" + new MimetypesFileTypeMap().getContentType(file) + "', ";
        sSql += "sysdate, 'FNDATTCH', 'KO', 'UTF8', 'BINARY')";
        System.out.println("sSql = " + sSql);
        stmt = conn.createStatement();
        stmt.executeUpdate(sSql);
        stmt.close();
        System.out.println("insert ok.......");
 
        // EMPTY_BLOB() 처리
        // : empty_blob()로 초기화되지 않은 경우 초기화 필요...
        sSql = "update fnd_lobs set FILE_DATA = empty_blob() where FILE_ID = " + sId_fnd_lobs + "";
        stmt = conn.createStatement();
        stmt.executeUpdate(sSql);
        stmt.close();
        System.out.println("empty_blob ok.......");
 
        // GET EMPTY BLOB
        Blob emptyBlob  = null;
        sSql = "select FILE_DATA from fnd_lobs where FILE_ID = " + sId_fnd_lobs;
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sSql);
        if (rs.next()) emptyBlob = rs.getBlob(1);
        System.out.println("select ok.......");
 
        // SET BLOB FIELD
        oracle.sql.BLOB blob = (oracle.sql.BLOB)emptyBlob;
        outstream = blob.getBinaryOutputStream();
        int size = blob.getBufferSize();
        finstream = new FileInputStream(file);
 
        byte[] buffer = new byte[size];
        int length = -1;
        while ((length = finstream.read(buffer)) != -1) {
            outstream.write(buffer, 0, length);
        }
 
        if (finstream != null) finstream.close();
        if (outstream != null) outstream.close(); 
 
        /* 2. fnd_documents ***************************************************/
        sSql = "insert into fnd_documents ";
        sSql += "(DOCUMENT_ID, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY, ";
        sSql += "LAST_UPDATE_LOGIN, DATATYPE_ID, CATEGORY_ID, SECURITY_TYPE, ";
        sSql += "SECURITY_ID, PUBLISH_FLAG, USAGE_TYPE) ";
        sSql += "values(" + sId_document_id + ", sysdate, 2374, sysdate, 2374, 13820282, 6, 35, 1, 0, 'Y', 'O')";
        System.out.println("sSql = " + sSql);
        stmt = conn.createStatement();
        stmt.executeUpdate(sSql);
        stmt.close();
        System.out.println("insert ok.......");
 
        /* 3. fnd_documents_tl ************************************************/
        sSql = "insert into fnd_documents_tl ";
        sSql += "(DOCUMENT_ID, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY, ";
        sSql += "LAST_UPDATE_LOGIN, LANGUAGE, DESCRIPTION, FILE_NAME, MEDIA_ID, SOURCE_LANG) ";
        sSql += "values(" + sId_document_id + ", sysdate, 2374, sysdate, 2374, 13820282, 'KO', '스펙첨부', ";
        sSql += "'" + fileName + "', 638484, 'KO')";
        System.out.println("sSql = " + sSql);
        stmt = conn.createStatement();
        stmt.executeUpdate(sSql);
        stmt.close();
        System.out.println("insert ok.......");
 
        sSql = "insert into fnd_documents_tl ";
        sSql += "(DOCUMENT_ID, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY, ";
        sSql += "LAST_UPDATE_LOGIN, LANGUAGE, DESCRIPTION, FILE_NAME, MEDIA_ID, SOURCE_LANG) ";
        sSql += "values(" + sId_document_id + ", sysdate, 2374, sysdate, 2374, 13820282, 'US', '스펙첨부', "; // 위의 Insert와 'US' 부분만 다름
        sSql += "'" + fileName + "', 638484, 'KO')";
        System.out.println("sSql = " + sSql);
        stmt = conn.createStatement();
        stmt.executeUpdate(sSql);
        stmt.close();
        System.out.println("insert ok.......");
 
        /* 4. fnd_attached_documents ******************************************/
        sSql = "insert into fnd_attached_documents ";
        sSql += "(ATTACHED_DOCUMENT_ID, DOCUMENT_ID, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY, LAST_UPDATE_LOGIN, ";
        sSql += "SEQ_NUM, ENTITY_NAME, PK1_VALUE, AUTOMATICALLY_ADDED_FLAG) ";
        sSql += "values(" + sId_ATTACHED_DOCUMENT_ID + ", " + sId_document_id + ", sysdate, 2374, sysdate, 2374, 13820282, ";
        sSql += "10, 'REQ_HEADERS', '253076', 'N')";
        System.out.println("sSql = " + sSql);
        stmt = conn.createStatement();
        stmt.executeUpdate(sSql);
        //stmt.close();
        System.out.println("insert ok.......");
 
        DBConnect.commitJDBCTransaction(conn);
        System.out.println("success.......");
    }
    catch (Exception e)
    {
        errMsg = e.toString();
        System.out.println(errMsg);
        if (conn != null) DBConnect.rollbackJDBCTransaction(conn);
    }
    finally
    {
        System.out.println("success2.......");
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        System.out.println("success2-1.......");
        DBConnect.closeConnection(conn);
        System.out.println("success3.......");
    }
 
%>
 
<script language="JavaScript">
 
    <% if (errMsg.equals("")) { %>
        alert("Success....");
    <% } else { %>
        alert('<%=errMsg%>');
    <% } %>
 
</script>

Application에서 Export 오류 해결 방법

ERP Application의 메뉴에서 아래 그림과 같이

2010-04-02_152332화면의 특정BLOCK 의 내용을 Export 받는 기능이 있습니다.

사용자의 편의성을 위하여 Appication 셋업시 Export 되어지는 파일의 확장자를 XLS로 지정하거나, 아니면 원래의 기본 확장자를 가진 파일을 엑셀과 연결 프로그램으로 설정하여 Microsoft Excel 이 실행되어지게 하는 편입니다. 
정상적으로 파일이 생성되어 다운로드 되면 엑셀로 연결되어 실행이 되는 반면, 사용자의 PC 환경설정에 따라 엑셀이 실행되지 않는 문제가 발생합니다.

보통 Export 버튼을 누르면 화면이 잠시 나타났다 사라지는 현상으로 인해 많은 문의가 오는 편입니다.

이 경우의 해결 방법입니다.

1. 윈도우 탐색기 실행후 도구 –> 폴더 옵션 을 클릭합니다.

2010-04-02_152130 2. 아래 그림과 같은 화면에서 파일 형식 탭을 클릭 후 확장명이 XLS 를 찾아서 고급을 클릭 합니다.

2010-04-02_152204 3. 붉은 색 테두리 해 놓은 부분의 체크표시를 모두 없앱니다.

2010-04-02_152234이상 이렇게 설정하게 되면 문제없이 Export 가 되어 엑셀이 실행되어 질 것입니다.

그리고, 또 하나 웹 화면에서 익스포트가 되기 위해서는 익스플로러 설정에서 팝업차단은 필수적으로 해제가 되어 있어야 합니다. 익스플로러에서 팝업차단이 해제되어 있다고 하더라도, 요즘은 익스플로러 애드온으로 많은 툴바들이 많은데 이 툴바의 설정에서도 팝업을 방지하는 기능이 있기 때문에 각 툴바에서의 팝업차단 기능도 해제가 되어 있어야 합니다.

이 팝업차단 기능 관련하여서는 ERP Application 의 기능 오류가 아니지만, 이 문제로 인해서 현업사용자들이 불편함을 호소하는 경우도 많으니 이런 경우도 함께 알려드리는 편이 좋을 듯 합니다.

 

작성자 : amagrammer / 편집 : amagrammer

Windows 7에 Oracle 11g Client 설치

일전에 Windows 7에 Oracle 10g Client 설치 관련하여 글을 적은 적이 있습니다.

http://oracleebs.co.kr/?p=38

이번 글에서는 Windows 7에 Oracle 11g Client 설치에 관해 적어 볼까 합니다. 이전글 마지막 부분에 타 사이트의 링크를 통해 소개하기도 하였습니다만, 이번에 노트북을 새롭게 장만하면서 Oracle Client 도 최신으로 설치해보고자 하여 직접 설치를 해보면서 경험을 토대로 적습니다.

11g를 설치하면, 10g 와 마찬가지로 Windows 7에서는 설치가 되지 않는다는 메세지가 나옵니다. 운영체제를 지원하지 않는 것이죠.

2010_03_30_144709

위 그림의 하단 메세지를 보면, 운영체제의 버젼이 나옵니다. Windows 7은 6.1 버젼이라 10g와 마찬가지로 Windows 7에 대한 정보를 추가해주고 난 후 설치하면 정상적으로 설치가 됩니다.

우선, 11g Client 파일을 다운로드 하고 나서, 압축을 풉니다.

설치 파일 중에  client\stage\prereq\client\refhost.xml 을 열어 <CERTIFIED_SYSTEMS> 섹션 부분에

<OPERATING_SYSTEM> 
  <VERSION VALUE=”6.1″/> 
</OPERATING_SYSTEM>

추가합니다.

Windows 7운영체제의 버젼이 6.1이기 때문에 6.1 버젼에 대한 내용을 추가하는 것이라는 것은 대충 파일 내용 보면 알 수 있을 것입니다.

이렇게 변경하여 설치하면 정상적으로 설치가 될 것입니다. 10g 때보다는 변경하여야 할 파일이 하나뿐이라 쉬울 듯 합니다.

그리고, 또 하나

“운영체제 버젼을 체크하지 않도록 하여 강제로 설치하게 할 수도 있습니다. “라고 하여

=====
명령프롬프트에서 setup 파일의 경로를 찾아서

setup –ignoreSysPrereqs

로 명령을 실행하면 됩니다.
=====

라는 글도 검색해보면 찾을 수 있는데, 저는 실행해보니 위 방법으로는 설치가 되지 않았습니다.

확실한 방법은 설치 파일에 Windows 7에 대한 정보를 추가하여 설치하는 방법이지 않을까 생각합니다.

 

작성  : amagrammer / 편집 : amagrammer

List Item의Elements in List 내 Element 삭제

Forms Developer 로 개발시에 List Item 을 사용하는 경우 Element 를 추가하는 경우는 쉽게 추가할 수 있습니다.
하지만, 반대로 추가된 Element 에 대해 삭제할 경우 단순히 Element와 Value 값을 빈칸(NULL)로 만드는 것으로 Element 가 삭제되지 않습니다. 이경우 NULL 값을 가진 Element가 남아있게 되는 것입니다.

처음으로 D2K를 접하고 개발해본 경우 이런 경우를 한번씩은 다 경험했을 듯 합니다. 그래서, 기존의 것을 지우고 새로 List Item 을 만드는 경우도 있구요.

2010-03-26_083201위의 그림에서 보는 List Item은 이미 사용하고 있는 List Item을 복사하는 방법을 사용하여 새롭게 List Item 을 추가한 후 Element와 Value 를 수정하고 있는 화면입니다.

이 경우에 현재 Element로 3개가 등록이 되어 있는데, 위의 두 Element 의 경우는 새로운 값으로 수정을 하였고, 제일 마지막의 Buyer 는 삭제하고 싶습니다. 이럴 경우 Element 를 삭제하는 키가

Shift + Ctrl + <

입니다.

반대로

Shift + Ctrl + >

하게 되면 Element 가 추가가 됩니다만 추가시에는 화살표키와 마우스로도 충분하기 때문에 이렇게 하는 경우는 잘 없을 듯 합니다.
알면 간단하지만, 모르면 헤매게 되어 정리해봤습니다. 많이 사용을 안하다 보니 한번씩 잊어버리는 경우가 생겨서..

 

작성 : amagrammer / 편집 : amagrammer

컬럼의 값이 문자인지 숫자인지 구별하는 함수

STX_OUT_TEMP 테이블의 ATTRIBUTE1 컬럼의 값들이 아래 그림에서와 같습니다.

2010-03-23_155814

즉, VARCHAR2 형식으로 정의된 컬럼에 저장된 값은 숫자형, 문자형, 기호 이렇게 아무렇게나 저장이 되어 있습니다.
이 컬럼의 값들 중에 숫자형식으로 나타낼 수 있는 값들만을 쿼리하고 싶다면,

SELECT ATTRIBUTE1
  FROM STX_OUT_TEMP
 WHERE TRANSLATE(ATTRIBUTE1,'A1234567890','A') IS NULL;

과 같은 SQL 문을 생각할 수 있습니다.
TRANSLATE() 함수를 이용하여 숫자 혹은 문자를 특정문자(위의 SQL에서는 NULL로 바뀜)로 변환하는 방법입니다. TRANSLATE() 함수에 대한 설명은 레퍼런스를 찾아보시면 될 듯 하구요. 간단히 예를 들어
SELECT TRANSLATE(ATTRIBUTE1,'A1234567890','A'),                                                    -- 숫자
       TRANSLATE(ATTRIBUTE1,'0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','0'),          -- 문자
       TRANSLATE(ATTRIBUTE1,'@1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','@') -- 특수문자
  FROM STX_OUT_TEMP;

위의 SQL을 실행해보면, TRANSLATE() 함수로 문자 혹은 숫자 중 골라내고 싶은 값을 NULL 문자로 치환하여 WHERE 문에 IS NULL 을 조건으로 주면 해당 RECORD를 SELECT 할 수 있습니다.

다시 말해, 컬럼의 값들이 숫자로만 되어 있는 지, 아니면 문자로 되어있는지 이렇게 알고 싶을 때가 있는데 이때 쉽게 사용할 수 있는 함수가 ORACLE 에는 없는 것으로 알고 있습니다. 그래서 위와 같은 SQL문을 생각하게 되는 것입니다.

그러나, MS-SQL 에서는 ISNUMERIC() 이라는 함수가 있습니다. 
MS-SQL의 이 함수처럼 ORACLE 에서도 테이블의 특정 컬럼에 문자와 숫자가 병행되어 입력되는 상황에서 이 컬럼중에서 숫자 형식으로만 된 값과 아니면 문자(정확히 말하면, 숫자로 변환할 수 없는)값으로 된 레코드만을 알고자 할 때가 필요합니다.

그래서, 오라클에서도 MS-SQL에서와 동일한 기능을 하는 함수를 만들어 사용하면 될 듯 하여 아래와 같은 함수를 만들었습니다.

CREATE OR REPLACE FUNCTION ISNUMERIC(i_str VARCHAR2) RETURN NUMBER
IS
 v_ret NUMBER;
BEGIN
  IF i_str IS NULL OR LENGTH(TRIM(i_str)) = 0 THEN
    RETURN 0;
  END IF;
 
  V_RET := TO_NUMBER(I_STR);
  RETURN 1;
 
EXCEPTION WHEN OTHERS THEN
  RETURN 0;
END ;

함수의 내용을 보면 입력 값이 올바른 숫자 데이터 형식으로 변환되면 1을 반환하고, 그렇지 않으면 0을 반환합니다.

이렇게 작성된 함수를 활용하여, 처음 소개한 SQL 문을 변경하여 보면

SELECT ATTRIBUTE1
  FROM STX_OUT_TEMP
 WHERE ISNUMERIC(ATTRIBUTE1) = 1;

로 변경할 수 있습니다.
이와 같이 공통적으로 활용될 수 있는 함수는 미리 정의하여 프로젝트 팀원간에 공용으로 활용하면 좋을 듯 합니다.

 

작성 : amagrammer / 편집 : amagrammer

Windows OS별 Service Pack 백업 파일 삭제

Microsoft에서는 Windows OS 발표 후 주기적으로 보안 및 기능개선 파일을 한데 묶어 서비스팩이라는 이름으로 제공하고 있습니다.
이렇게 제공되는 서비스팩의 가장 큰 목적이 보안과 관련된 내용이 많기 때문에 대부분 새로나온 서비스팩을 설치 하게 됩니다. 그만큼 필수적인 요소라고 생각되기 때문입니다.

하지만, 새로나온 서비스팩을 설치할때는 혹시나 모를 일로 인해 기존 파일들을 보관해놓고 신규 파일들로 대체하게 되면서 설치가 되는데, 이런 백업파일들은 정말 사용할 일이 없습니다. 보통 수백메가정도의 파일들이 하드디스크의 공간을 차지하고 있기 때문에 이런 파일들을 삭제하여 공간을 조금이나마 늘려보는 것은 어떨까 합니다.

1. Windows XP

2010-03-16_073917

폴더 옵션의 보기 탭에서 숨김 파일 및 폴더 표시를 활성화 주고 난 후 WINDOWS 폴더를 확인하여 보면, $NtServicePackUninstall$ 폴더가 존재합니다.
이 폴더를 과감히 삭제해 주면 됩니다.

2. Windows Vista

Microsoft 에서도 서비스팩 백업파일이 필요가 없는 사람이 대부분이라는 것을 인식했는지 Vista 부터는 삭제할 수 있는 기능을 자체적으로 제공합니다.

1) 서비스팩1 의 경우

vsp1cln.exe

2) 서비스팩2 의 경우

compcln.exe

를 명령프롬프트 창에서 실행해 주면 됩니다.

조만간 Windows 7 에 대해서도 서비스팩1이 나온다는 소식이 있던데, Windows 7에 대해서도 필수적으로 제공이 되지 않을까 생각해 봅니다.

이상 더이상 필요없는데 하드디스크 공간만 차지하는 서비스팩 설치 이전 백업 파일들의 삭제방법을 정리하였습니다.

 

작성 : amagrammer / 편집 : amagrammer

PL/SQL Developer에 VCS 플러그인 사용하기

PL/SQL Developer 에 마이크로소프트의 비주얼 소스 세이프를 활용할 수 있도록 인터페이스를 제공하는 플러그인이 있어서 소개하고자 합니다.

다운로드 : Version Control Integration Plug-In (4)

PL/SQL Developer 홈페이지의 Plug-Ins 메뉴에서 찾아볼 수 있으며, 플러그인 중에서도 나름 꾸준하게 버젼 업도 되고 있는 것으로 PC에 설치되어 있는 Version Control 프로그램을 감지해서 활용할 수 있게 해줍니다.
마이크로소프트 SCC Interface 가 포함되어 있는 제품에 대해서 지원을 한다고 하고, 요즘 많이 사용하고 있는 TortoiseSVN 에 대해서는 또 다른 프로젝트로의 홈페이지 링크까지 제공하고 있습니다.
그외 자세한 사항은 홈페이지의 글을 참고하세요^^

우선 위 플러그인을 사용하기 위해서는 마이크로소프트의 비주얼 소스 세이프가 설치되어 있어야 합니다. 혹시나 비주얼 소스 세이프의 설치가 어려우시다면 아래의 문서가 도움이 되길 바라면서 링크를 걸어봅니다. 윈도우 프로그램 설치하듯이 그냥 다음만 눌러주셔도 무난하게 설치는 되므로 어려움은 없을 듯 하며, Microsoft Visual Studio 제품을 많이 사용하기 때문에 구하기도 어렵지 않을 듯 합니다.

비주얼 소스 세이프 설치 : http://blog.naver.com/s75h78/80056462806

1. 새롭게 설치가 끝났거나, 이미 사용 중이라고 가정하고 비주얼 소스 세이프 Admin을 실행하여 PL/SQL Developer를 위해서 사용할 새로운 DB를 하나 생성해줍니다.

2010-03-08_1012042010-03-08_101307

Tools > Create Database 를 선택한 후 경로를 입력하면 됩니다.

2. 다운로드 받은 파일의 압축을 풀고, VCS 플러그인을 설치합니다. 설치하고 나면 PL/SQL Developer 메뉴에 아래와 같이 VCS 항목이 추가가 되는 것을 확인할 수 있습니다.

2010-03-09_162704

3. 메뉴 VCS > Open Project 를 선택하여 위와 같이 DB를 생성하였다면 아래와 같이 설정합니다.

2010-03-08_101443윗 그림에서 “$/”로 표시되어 있는 경로는 아래와 같이 처음 DB를 생성해준 경로가 루트가 됩니다.

2010-03-08_101508

4. 메뉴 VCS > Preferences 를 선택하면 여러가지 설정을 할 수 있는데, 아래 그림의 설정은 제가 현재 사용하고 있는 값입니다. 필요에 맞게 선택하시면 될 듯 합니다.

2010-03-08_101532

5. 여기까지 설정이 끝났으면 정상적으로 VCS를 이용가능 합니다.

VCS 메뉴 하위에 있는 서브메뉴의 각 항목은 버젼 컨트롤 관련 기능을 사용해보신 분들이면 다 아시는 내용일 듯 하며, Database 오브젝트 들에 대해서도 Version Control 을 사용한다고 체크를 하면,

사본 -2010-03-08_101632위 그림과 같이 Object 에 마우스 오른쪽 클릭을 하면 VCS 에 추가할 수 있는 메뉴가 나타납니다.

이상 VCS 플러그인을 사용할 수 있게 설정하는 법을 알아봤습니다. Version Control 에 대한 자세한 사항은 검색을 해보시면 많은 자료 찾을 수 있을 듯 합니다.

 

작성 : amagrammer / 편집 : amagrammer

Windows 7에 Oracle 10g Client 설치

Oracle 이라는 회사가 Windows 7이 나온지 나름 꽤 지난듯 한데, Windows 7 이 나오기 이전에 출시된 Oracle 제품에 대해서 지원 방침을 세우지 않은 것인지는 몰라도 설치프로그램을 이용할 경우 Windows 7 운영체제를 지원하지 않아 설치 시 에러가 발생합니다.

이 경우 아래와 같이 설치파일의 일부 파일에 Windows 7 정보를 추가해주면 설치가 정상적으로 됩니다.

1. 아래 링크를 통해 Oracle Database 10g Release 2 Client 파일을 다운 받습니다.

32bit : http://www.oracle.com/technetwork/database/10203vista-087538.html
64bit : http://www.oracle.com/technetwork/database/10204-winx64-vista-win2k8-082253.html

2. 다운로드 받은 파일의 압축을 풉니다.

3. 압축을 푼 파일들 중에 총 3개의 파일을 수정하여아 합니다. 첫번째 client\Disk1\install\oraparam.ini 파일을 열어 아래와 같이

[Certified Versions]
#You can customise error message shown for failure, provide value for CERTIFIED_VERSION_FAILURE_MESSAGE
Windows=5.0,5.1,5.2,6.0,6.1

Windows 7의 version이 6.1 이므로 추가합니다.
주석처리되어 있는 경우도 있는데, 주석을 풀고 추가해주시면 됩니다.

4. 두번째 client\Disk1\stage\prereq\client\refhost.xml 을 열어 <CERTIFIED_SYSTEMS> 섹션 부분에

<OPERATING_SYSTEM> 
  <VERSION VALUE=”6.1″/> 
</OPERATING_SYSTEM>

을 추가합니다.

5. 세번째 client\Disk1\\stage\prereq\client_prereqs\client\refhost.xml 파일도 두번째와 마찬가지로 <CERTIFIED_SYSTEMS> 섹션 부분에

<OPERATING_SYSTEM> 
  <VERSION VALUE=”6.1″/> 
</OPERATING_SYSTEM>

을 추가합니다.

6. 이렇게 수정하여 설치를 진행하면 정상적으로 설치가 됩니다.

혹시나, 편집하기 어려우신 분들을 위하여 편집하여 수정된 파일을 압축하여 첨부합니다.

위 파일을 다운로드하여 기존 파일에 덮어쓰기 한 후 설치하시면 간단히 됩니다.

참고로, Oracle 11g Client를 설치하기 위해서는 하나의 파일만 수정하면 된다고 합니다. 
저의 경우에 아직 11g Client 설치는 해보지 않아서 테스트는 해보지 않았지만, 11g Client의 설치와 관련된 링크 하나 소개합니다.

http://msutic.blogspot.com/2009/08/how-to-instal-oracle-client-11g-on.html

Client 설치가 아닌 DB 설치시에도 경로는 다르지만, 위에 소개한 동일한 파일들이 포함되어 있기 때문에 그 파일들을 열어서 편집한 후 설치하시면 DB도 설치가 가능합니다.

하지만, 이렇게 사용자가 하나하나 수정하여 설치하는 것 보다 빨리 Oracle 에서 Windows 7을 지원하는 설치프로그램을 만들어 주길 바라는 마음입니다.

 작성 : amagrammer / 편집 : amagrammer

key_duprec (Shift+F6) 기능 활성화

Form 화면으로 개발할 때, 사용자의 요청에 의해 직전 Record 의 내용을 그대로 다음 Record로 복사하는 기능을 구현할 필요가 있습니다.
원래 ERP Application UI에서는, Shift+ F5 키로 직전 레코드의 동일 필드의 내용 복사와 Shift+ F6으로 직전 레코드 전체 내용으로 동일한 Record 값 생성을 할 수 있는 단축 키가 존재합니다.
하지만, Extension 을 위해 추가 개발되는 폼 들을 위해 제공되는 Templete 폼 파일로 개발하게 되면 Shift+F5는 정상적으로 동작을 하나, Shift+F6은 아래 화면과 같이 사용이 막혀 있다는 메세지가 나타납니다.

2010-03-02_162128 Shift+F6 기능을 하는 트리거가 key_duprec 인데, APP_STANDARD 내의 Procedure 정의를 보면

PROCEDURE key_duprec IS
BEGIN
  --
  -- By default the function is 'disabled'. Developers must write code
  -- for each block to allow this functionality.
  --
  fnd_message.set_name('FND', 'FUNCTION_NOT_AVAILABLE');
  fnd_message.error;
  RAISE form_trigger_failure;
END key_duprec;

와 같이 되어 있습니다.
즉, 기본적으로는 폼 레벨 트리거에서 위에 정의되어 있는 프로시져를 호출하게 되어 있어, 실행이 되지 않습니다.

이 기능을 부여하기 위해서는 설명에서와 같이 각 BLOCK 에 트리거를 추가하여 코딩을 하게 되면 정상적으로 코딩을 한 기능으로 동작하게 됩니다. 특별한 기능없이 그냥 단순히 원래 기능 그대로 직전 Record 의 내용으로 똑같은 값으로 Record 를 채우고자 할 경우에는

DUPLICATE_RECORD;

를 추가하기만 하면 됩니다.

그러나, 보통 직전 Record 의 값을 그대로 가져오기도 하지만, 값을 가져오지 않아야 될 필드도 있을 수 있으며, 특정 필드는 다른 값으로 채워줘야 할 경우도 있습니다. 그리고, Validation 을 위한 코드도 들어가야 할 경우도 있습니다.

이 경우엔 추가적인 코딩을 통하여 완벽한 Record 복사 기능을 구현할 수 있을 듯 합니다.

참고로 최근에 제가 작성하였던 코드 하나 예로 들어보겠습니다.

DECLARE
 
  V_USER_ID	NUMBER := TO_NUMBER(FND_PROFILE.VALUE('USER_ID'));
  V_USER_NAME   VARCHAR2(10);
  V_DEPART_NAME VARCHAR2(150);
 
BEGIN
 
  SELECT USER_NAME,
         SUBSTR(DESCRIPTION,1,30) AS DESCRIPTION
    INTO V_USER_NAME,
         V_DEPART_NAME
    FROM HR_EMPLOYEES A,
         FND_USER B
   WHERE EMPLOYEE_NUM = USER_NAME
     AND USER_ID = V_USER_ID;
 
DUPLICATE_RECORD;
 
COPY ('', 'B_CHANGE_ORDER.LIST_SEQ');
COPY ('', 'B_CHANGE_ORDER.ECO_SEQ');
COPY (V_USER_NAME, 'B_CHANGE_ORDER.CHARGE_USER');
COPY (V_DEPART_NAME, 'B_CHANGE_ORDER.DEPART_NAME');
 
END;

위 소스는 ‘B_CHANGE_ORDER 블럭에 key_duprec 트리거를 구현한 내용으로 직전 레코드를 복사하고, LIST_SEQ와 ECO_SEQ에는 NULL 값을 넣고, CHARGE_USER와 DEPART_NAME 에는 현재 사용자의 사번과 부서명을 넣게 됩니다.
 

작성 : amagrammer / 편집 : amagrammer