솔루션"을 수행할 수 없습니다 DML 작업 내에서 쿼리를"?

나는 사용 데이터 분석 도구 및 필요가 있었을 받아들이 값을 사용자에게 전달하는 매개변수에 저장됩니다. 꽤 함 그래서 나는 이것을 쓰

create or replace
procedure complex(datainput in VARCHAR2)
is
begin
insert into dumtab values (datainput);
end complex;

내가 실행되 이에SQL 개발자를 사용하여 다음과 같은 문

begin
complex('SomeValue');  
end;

그것은 좋은 일이며,값으로 삽입니다. 그러나,위의 문에서 지원되지 않 데이터 분석 도구,그래서 의지를 사용하는 기능을 대신 합니다. 다음의 코드를 이 함수는 컴파일됩니다.

create or replace
function supercomplex(datainput in VARCHAR2)
return varchar2
is
begin
insert into dumtab values (datainput);
return 'done';
end supercomplex;   

다시 한번 시도는 그것을 실행에서SQL 개발자지만,I got을 수행할 수 없습니다 DML 작업 내에서 쿼리실행시 다음과 같은 코드

select supercomplex('somevalue') from dual;

나의 질문은 -요 문을 실행할 수 있는 언급된 기능SQL 개발자나 -기능을 수행할 수 있는 내가 무엇을 찾고 있는 실행할 수 있는 선택한 문입니다. -가능하지 않은 경우 무'm 묻고 싶은 이유도 알릴 수 있을 내리고 나는 아주 새로운(주처럼 오래?) PL/SQL 그래서 나는 규칙을 인식하지 못하고 구문.

P.S. 내가 원하는 어떻게 이었 C++또는 Java:(

편집

요 기능을 실행하에 SQL 개발자이기 때문에 그것을 실행하기 전에 에 DMine(는 도구입니다)테스트하기 위해서는 유효한 경우 또는하지 않습니다. 아무것도 잘못된 SQL 도에서 잘못된 DMine,하지만 다른 방법이다.

도움을 주셔서 감사합니다,나는 상황을 이해하고 왜 그것이 불법이/권장하지 않음

질문에 대한 의견 (3)
해결책

당신이 사용할 수 있는 지시어pragma autonomous_transaction. 이 실행되는 기능으로 독립적인 트랜잭션을 수행 할 수 있습니다 DML 올리지 않고 ORA-14551.

다는 것을 알고 있기 때문자율 트랜잭션독립적인 결과의 DML 것이 최선을 다하고의 범위 밖의 부모 트랜잭션이 있습니다. 대부분의 경우하지 않을 것이고 적절한 해결 방법.

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2)
  2     RETURN VARCHAR2 IS
  3     PRAGMA AUTONOMOUS_TRANSACTION;
  4  BEGIN
  5     INSERT INTO dumtab VALUES (datainput);
  6     COMMIT;
  7     RETURN 'done';
  8  END supercomplex;
  9  /

Function created

SQL> SELECT supercomplex('somevalue') FROM dual;

SUPERCOMPLEX('SOMEVALUE')
--------------------------------------------------------------------------------
done

SQL> select * from dumtab;

A
--------------------------------------------------------------------------------
somevalue

톰 카이트좋은 설명이유에 대해 이런 오류가 발생에서 첫 번째 장소입니다. 그것은 안전하지 않기 때문에 따라 달라질 수 있습니다 따라하기 위해서는 행 처리됩니다. 또한,Oracle 지 않't 을 보장하는 함수가 실행될 것 적어도 한 번당 한번 행이 있습니다.

해설 (0)

다만 변수를 선언을 받아들이 반환 값은,예를 들어:

declare
    retvar varchar2(4);
begin
    retvar := supercomplex('somevalue');
end;

선택하지 않't 작업하기 때문에 기능을 수행하는 삽입하는 경우,모든 값을 반환한 다음 그것을 할 수 있습니다.

해설 (1)

다만 해당 기능을 실행합니에미if...최종 경우;문을 무시하는 반환 값:

exec 경우 supercomplex('이름은 대/소문자를 구분')다음 null;end 는 경우;

또 그것을 실행하기 위한 매개 변수put_line절차를 출력하는 반환 값:

exec dbms_ouput('의 결과 supercomplex='||supercomplex('이름은 대/소문자를 구분'));

의 결과 supercomplex=행
해설 (0)