DB/Oracle

토트에서 함수실행

벨포트조던 2017. 2. 21.
반응형

http://database.sarang.net/?inc=read&aid=30555&criteria=oracle



CREATE OR REPLACE FUNCTION FnGetBalance
         (v_empno         IN    varchar)

          -- 리턴되는 변수의 데이터타입을 꼭 정의해야 합니다
          RETURN NUMBER 

        IS

        v_sal  str200t.collect_amt%type;

        BEGIN
       
 
        SELECT 
        nvl(sum(nvl(collect_amt,0)),0)
  into v_sal
        FROM str200t
        WHERE inout_code = v_empno;


        -- 리턴문이 꼭 존재해야 합니다
        RETURN v_sal;

       END;

 

다음과 같이 함수를 만들었습니다.

 

그냥 sql에서는 다음과 같이 변수지정해서 실행하면 원하는 값을 얻을수 있습니다.

SQL> var salary number;

SQL> EXECUTE :salary := fnGetBalance('B0000006')

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> print salary

    SALARY
----------
    230000

 

그런데 토드에서는 어떻게 해야지요.. 그냥 f9누르면 안되더라구요..

초보라 그러니 좀 자세히 좀 알려주시면 감사하겠습니다..

라는 질문에요

dual..로 하세요..

라는 답변이 달렸는데요

이게 도통 무슨소리인지 모르겠네요

토드에서 함수 실행 어떻게 해야하나요???

이 글에 대한 댓글이 총 4건 있습니다.

select fnGetBalance('B0000006') from dual;

이거 아닌지요?

드라군님이 2007-05-02 10:32:37에 작성한 댓글입니다. Edit 
select fc_update_sal('7499') from dual
이런식으로 했더니요
"ORA-14551"이란 에러가 나더라구요
그래서 위에꺼로 네이버에서 검색을했더니
어떤분이 답변을
=====================================
오라클 펑션안에서 DML문이 가능합니다. 
단 , 사용하실때 호출 방식이 틀려 져야 합니다. 
기본적으로 사용하는 방식이 SELECT 펑션명 FROM dual ; 
로 많이들 사용하시는데요 그리 사용하실때는 당연히 
SELECT 문에서는 DML이 안되겠지요 .. 
DML이 들어있는 펑션을 실행하실경우는 

DECLARE 
v_return varchar2(200); 
BEGIN 
v_return := 펑션(); 
END; 

이런식으로 사용하시면 됩니다 . 
SELECT문을 이용하신 펑션 호출은 안되구요 .. 
직접 펑션이름으로 호출해서 사용하시면 DML이 들어있는 펑션을 사용하실수 있습 
니다. 
======================================
라고 달아주셨거든요
여기서 질문 하나더...
그렇다면 토드에서 DML function 을 실행하기 위해 이름없는 프로시져를 생성해야 하는건가요?
이런식으로 해야한다면... fucntion마다 실행을 위한 프로시져가 있어야 한단 말인지..
아..
그리구요.. 
위에 처럼하면 

SQL> print salary

    SALARY
----------
    230000

과 같은 효과는 어떻게 처리하나요.. 
^^;;;
제가 이제 막 pl/sql을 접해서 아직 개념도 많이 부족하고 모르는것도 많아서 ^^;;
많이좀 알려주세요

토드와함수님이 2007-05-03 10:50:45에 작성한 댓글입니다. Edit 

찿아보신 부분은 정확한 사실입니다.

select-list 에서의 함수 호출시 호출되는 함수에 dml 이 있다면 그것은 select [ 자료조회문 ]의 성격에 

위배될 뿐아니라 그 함수로 인해 다른 select 되는 값이 변경될수도 있음으로 금지되는것은

일면 당연하고도 상식적이라고 보입니다.


토드같은 툴이라면


declare

     salary number;

begin

     salary:=fnGetBalance('B0000006');

     dbms_output.put_line(salary);

end;


dbms_output 을 true로 설정하시고 수행하시면

값을 확인하실수 있을겁니다.


ㅅㄱ

ㅁ님이 2007-05-03 17:40:55에 작성한 댓글입니다.
이 댓글은 2007-05-03 17:42:47에 마지막으로 수정되었습니다. Edit 

감사합니다.
이제야 조금 이해가 될는듯 하네요...
^^
행복한 하루 되세요


반응형

댓글