1. Test Table 및 Procedure 생성

CREATE TABLE TEST1
( ID NUMBER NOT NULL
, NAME VARCHAR2(10));

DELETE FROM TEST1;
COMMIT;

CREATE OR REPLACE PROCEDURE PROC02(P_NUM IN NUMBER)
IS
    V_ID TEST1.ID%TYPE;
    V_NUM NUMBER;
BEGIN
    SELECT NVL(MAX(ID), 0) + 1 INTO V_ID FROM TEST1;
    INSERT INTO TEST1 VALUES (V_ID, 'PROC02 : ' || V_ID);
    
    V_NUM := 1 / P_NUM;

    EXCEPTION
        WHEN OTHERS THEN
            ROLLBACK;
            DBMS_OUTPUT.PUT_LINE(' PROC02 ERROR MSG : ' || SQLERRM);
            RAISE_APPLICATION_ERROR (-20000,' PROC02 ERROR MSG : ' || SQLERRM);    -- 이 구문 있어야 Application에서 Exception 호출 된다. 없으면 Application에서 Exception 잡지 못한다.
END;
/

 

2. test.mxml

...
            private function clickHandler(event:MouseEvent):void
            {
                switch (event.target)
                {
                    case btn00 :
                        var sp:SCServiceProvider = new SCServiceProvider();
                        sp.descriptor = "edu99";
                        sp.serviceId = "call.proc";
                        sp.locks = [this];
                        sp.monitors = [this];
                        sp.addEventListener(ResultEvent.RESULT, function(event:ResultEvent):void
                        {
                            var rtnMap:SCObject = event.result.result as SCObject
                            SCAlert.show(rtnMap.msg);
                        });
                        sp.clearInputs();
                        sp.addInput("param", _searchInfo);
                        sp.service();
                        break;
...

 

3. service.xml

<?xml version="1.0" encoding="utf-8"?>

<service-descriptor id="edu99">

    <service id="call.proc" label="procedure test">
        <script>
            <![CDATA[
            var rtnMap = new Map();
            var param  = $data.param;
             
            try
            {
                $jdbc.update("edu99", "insert.test1", null);
                //$jdbc.commit();   // 여기서 부분 COMMIT 가능하다.
                
                param.p_num = param.usr_nm;
                $jdbc.call("edu99", "call.proc", param);
                
                rtnMap.msg = "Success";
            }
            catch (e)
            {
                $jdbc.rollback();    // 명시적인 이 구문 없어도 Procedure에서 Exception 발생하면 부분 COMMIT만 하지 않았다면 모두 ROLLBACK된다.
                                     // 즉 명시적인 COMMIT/ROLLBACK구문이 없어도, 정상 처리되면 자동 COMMIT되고, Exception 발생하면 자동 ROLLBACK된다.
                
                $logger.error(e);
                
                rtnMap.msg = e.toString();
            }
            finally
            {
                $data.result = rtnMap;
            }
            ]]>
        </script>
    </service>
...

 

4. sql.xml

<?xml version="1.0" encoding="utf-8"?>

<sql-descriptor id="edu99" data-source="srmDS">
    
    <sql id="insert.test1" comment="procedure test">
       <![CDATA[
            DECLARE
                V_ID NUMBER;
            BEGIN
                SELECT NVL(MAX(ID), 0) + 1 INTO V_ID FROM TEST1;
                INSERT INTO TEST1 VALUES (V_ID, 'PROC02 : ' || V_ID);
                -- COMMIT;        -- 여기서 부분 COMMIT 가능하다.
            END;
        ]]>
    </sql>
            
    <sql id="call.proc" comment="procedure test" callable="true">
       <![CDATA[
           CALL PROC02(#p_num:integer:in#)
       ]]>
    </sql>
...