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>
...