복붙노트

[SQL] "쿼리 내부의 DML 작업을 수행 할 수 없습니다"로 해결?

SQL

"쿼리 내부의 DML 작업을 수행 할 수 없습니다"로 해결?

나는 데이터 분석 도구를 사용하고 내가 가지고있는 요구 사항은 사용자로부터 값을 수락 매개 변수로 그것을 통과하고 테이블에 저장하는 것이 었습니다. 내가 이것을 쓰고 앉아 있도록 예쁜 straighforward

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

나는 다음과 같은 문을 사용하여 SQL Developer에서이 실행

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 Developer에서 그것을 실행했지만, 나는 다음과 같은 코드를 실행시 쿼리 내부의 DML 작업을 수행 할 수있어

select supercomplex('somevalue') from dual;

내 질문은 - 나는 SQL Developer 또는에서 언급 한 기능을 실행할 수있는 문이 필요합니다 - 내가 어떤 무엇을 찾고 수행 할 수있는 기능은 선택 문이 실행할 수 있습니다. - 그것은 내가 부탁 해요 일을 할 수없는 경우 나는 아주 새로운 오전으로 내 관리자에게 알릴 수 있도록, 나는 이유를 싶습니다 PL / SQL에 내가 규칙을 인식하지 오전 그래서 (주처럼 오래된?) 구문.

추신 나는 이것이 C ++ 또는 자바 좋겠어요 방법 :(

편집하다

나는 그것 때문에이 유효인지 여부를 테스트하기 위해 (도구 인) DMine에서 실행하기 전에 SQL 개발자의 기능을 실행해야합니다. SQL의 아무것도의 무효는 다른 방법으로 주위를 DMine 잘못된 것이 아니라.

도움을 주셔서 감사합니다, 나는 상황을 이해하고 불법 이유에 / 권장하지 않습니다

해결법

  1. ==============================

    1.당신은 지시 프라 그마 AUTONOMOUS_TRANSACTION를 사용할 수 있습니다. 이것은 ORA-14551를 발생시키지 않고 DML을 수행 할 수있을 것이다 독립적 인 트랜잭션으로 기능을 실행합니다.

    당신은 지시 프라 그마 AUTONOMOUS_TRANSACTION를 사용할 수 있습니다. 이것은 ORA-14551를 발생시키지 않고 DML을 수행 할 수있을 것이다 독립적 인 트랜잭션으로 기능을 실행합니다.

    자율적 트랜잭션이 독립적이기 때문에, 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
    

    톰 카이트는 오류가 처음부터 발생 이유에 대해 좋은 설명이있다. 이 행이 처리되는 순서에 의존 할 수 있기 때문에 안전하지 않다. 또한, 오라클은 함수가 일단 및 행 당 한 번에 가장 이상에서 실행되는 것은 아닙니다.

  2. ==============================

    2.그냥 예를 들어, 반환 값을 받아들이는 변수를 선언 :

    그냥 예를 들어, 반환 값을 받아들이는 변수를 선언 :

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

    함수가 삽입을 수행하고 있기 때문에 한 모든 후 작동 할 값을 반환했습니다 경우 선택은 작동하지 않습니다.

  3. ==============================

    3.다만, 더미면 ... 최종면의 기능을 실행; 문은 반환 값을 무시합니다 :

    다만, 더미면 ... 최종면의 기능을 실행; 문은 반환 값을 무시합니다 :

    exec if supercomplex('somevalue') then null; end if;
    

    또는 출력 반환 값에 PUT_LINE 프로 시저에 대한 매개 변수로 실행 :

    exec dbms_ouput ('result of supercomplex='||supercomplex('somevalue'));
    
    result of supercomplex=done
    
  4. from https://stackoverflow.com/questions/8729236/solution-to-cannot-perform-a-dml-operation-inside-a-query by cc-by-sa and MIT license