Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

대상 버전

6.1.1 이하 버전.

6.3.1 버전에서는 에러코드 및 메시지 변경됨.

...

SELECT문 안에서 함수 사용 시 다음 에러가 발생합니다.

Code Block

iSQL> select func1() from dual;
[ERR-1105D : Unable to begin a new update statement.
0004 :       insert into T1 values(C1);
            ^                         ^
]

...

6.3.1 버전에서는 에러코드 및 메시지가 다음과 같이 변경되었습니다.

Code Block

iSQL> select func1() from dual;
[ERR-31386 : Cannot perform a DML, commit, or rollback inside a query.

In FUNC1
0004 :  insert into T1 values(C1);
       ^                         ^
]

...

# insert문을 포함하는 함수를 SELECT문 안에서 사용했을 때 에러가 발생하는 예제

Code Block

iSQL> create or replace function func1() return varchar(10) as c1 varchar(10);
2 begin
3 select c1 into c1 from t1;
4 insert into t1 values(c1);
5 return c1;
6 end;
7 /
Create success.
iSQL> select func1() from dual;
[ERR-1105D : Unable to begin a new update statement.
0004 :       insert into T1 values(C1);
            ^                         ^
]

...

   execute 구문에서는 성공적으로 수행됨.

Code Block

iSQL> select * from t1;
C1
--------------
abc
1 row selected.
iSQL> var c1 varchar(10);
iSQL> exec :c1 := func1();
Execute success.
iSQL> print var;
[ HOST VARIABLE ]
-------------------------------------------------------
NAME                 TYPE                 VALUE
-------------------------------------------------------
C1                   VARCHAR(10)          abc
iSQL> select * from t1;
C1
--------------
abc
abc
2 rows selected.

...

# 위 함수를 SELECT문 안에서 사용하기 위해 insert문을 제거하고 SELECT문 안에서 사용했을 때 성공적으로 수행되는 예제

Code Block

iSQL> create or replace function func1() return varchar(10) as c1 varchar(10);
2 begin
3 select c1 into c1 from t1;
4 return c1;
5 end;
6 /
Create success.
iSQL> select func1() from dual;
FUNC1
--------------
abc
1 row selected.  

...