http://database.sarang.net/?inc=read&aid=30555&criteria=oracle
CREATE OR REPLACE FUNCTION FnGetBalance -- 리턴되는 변수의 데이터타입을 꼭 정의해야 합니다 IS v_sal str200t.collect_amt%type; BEGIN
END;
다음과 같이 함수를 만들었습니다.
그냥 sql에서는 다음과 같이 변수지정해서 실행하면 원하는 값을 얻을수 있습니다. SQL> var salary number; SQL> EXECUTE :salary := fnGetBalance('B0000006') PL/SQL 처리가 정상적으로 완료되었습니다. SQL> print salary SALARY
그런데 토드에서는 어떻게 해야지요.. 그냥 f9누르면 안되더라구요.. 초보라 그러니 좀 자세히 좀 알려주시면 감사하겠습니다.. 라는 질문에요 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을 접해서 아직 개념도 많이 부족하고 모르는것도 많아서 ^^;;
많이좀 알려주세요
찿아보신 부분은 정확한 사실입니다.
select-list 에서의 함수 호출시 호출되는 함수에 dml 이 있다면 그것은 select [ 자료조회문 ]의 성격에
위배될 뿐아니라 그 함수로 인해 다른 select 되는 값이 변경될수도 있음으로 금지되는것은
일면 당연하고도 상식적이라고 보입니다.
토드같은 툴이라면
declare
salary number;
begin
salary:=fnGetBalance('B0000006');
dbms_output.put_line(salary);
end;
dbms_output 을 true로 설정하시고 수행하시면
값을 확인하실수 있을겁니다.
ㅅㄱ
감사합니다.
이제야 조금 이해가 될는듯 하네요...
^^
행복한 하루 되세요
'DB > Oracle' 카테고리의 다른 글
Connection 에 따른 ResultSet 의 설정, resultSet row 수, 개수 (0) | 2017.03.29 |
---|---|
[oracle] merge into (0) | 2017.03.29 |
PK 가 없는 테이블에서 중복된 데이터 제거하기 (0) | 2016.12.22 |
패스워드 암호화 정리 (0) | 2016.04.25 |
loginexe 파일 예제 (0) | 2016.03.09 |
댓글