programing

Oracle의 기능과 프로시저 비교

i4 2023. 3. 27. 21:01
반응형

Oracle의 기능과 프로시저 비교

Oracle의 기능과 프로시저의 주요 차이점은 무엇입니까?

기능으로 모든 것을 할 수 있는데 왜 절차를 밟아야 합니까?

  1. sql문의 프로시저를 호출할 수 없는 경우, 같은 작업을 하기 위한 함수를 작성합니다.

  2. 프로시저가 값을 반환하지 않습니다. 예. dml 작업 후 sql%rowcount 또는 1(성공), 0(예외)만 반환합니다.

  3. 프로시저와 함수는 모두 OUT/IN OUT 파라미터를 통해 콜 환경에 변수를 전달할 수 있습니다.

성능의 차이는 기능보다 절차가 빠르다는 점이라고 들었습니다만, 자세한 내용은 포함되어 있지 않습니다.

로 ( 값을 , '모든 유형의 값을 반환하다'와 같은 매개 변수를 것입니다. 반면 프로시저의 경우 다음과 같은 매개 변수를 사용해야 합니다.OUT ★★★★★★★★★★★★★★★★★」IN OUT이치는 일반 함수로 할 수 있습니다.SQL서, 「 」의 할 수 때문에,SQL★★★★★★★★★★★★★★★★★★.

기능과 순서의 몇 가지 차이점

  1. 함수는 항상 return 문을 사용하여 값을 반환하지만 프로시저는 파라미터를 통해 하나 이상의 값을 반환하거나 전혀 반환하지 않을 수 있습니다.~는,OUT파라미터는 기능에서 계속 사용할 수 있습니다.또한 이러한 파라미터는 권장되지 않습니다.「」를 사용합니다.OUT매개 변수는 함수가 SQL 문에서 사용되는 것을 제한합니다.

  2. 는 일반적인 할 수 . 예를 들어, SQL 문에서는 사용할 수 있습니다.SELECT,INSERT,UPDATE,DELETE,MERGE안 되지만요, 절차상으로는 안 돼요.

  3. 함수는 일반적으로 비즈니스 로직을 실행하기 위해 절차를 사용하는 경우 계산에 사용됩니다.

  4. Oracle은 후속 SQL 문의 성능을 개선하기 위해 "기능 기반 인덱스"를 생성하는 기능을 제공합니다.이는 쿼리의 where 절에 있는 인덱스된 열에서 함수를 수행할 때 적용됩니다.

기능 및 기능에 대한 상세 정보여기와 여기 절차가 있습니다.

절차와 기능 간에 성능 차이는 거의 없습니다.

극히 드문 경우입니다.

  • A 차IN OUT인라이닝이 네이블로 되어 있는 경우 인수는 함수 반환보다 빠릅니다.
  • A 차IN OUT인라이닝이 디세이블일 경우 인수가 함수 반환보다 느립니다.

테스트 코드

--Run one of these to set optimization level:
--alter session set plsql_optimize_level=0;
--alter session set plsql_optimize_level=1;
--alter session set plsql_optimize_level=2;
--alter session set plsql_optimize_level=3;

--Run this to compare times.  Move the comment to enable the procedure or the function.
declare
    v_result varchar2(4000);

    procedure test_procedure(p_result in out varchar2) is
    begin
        p_result := '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
    end;

    function test_function return varchar2 is
    begin
        return '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
    end;
begin
    for i in 1 .. 10000000 loop
        --Comment out one of these lines to change the test.
        --test_procedure(v_result);
        v_result := test_function;
    end loop;
end;
/

결과.

Inlining enabled:  PLSQL_OPTIMIZE_LEVEL = 2 (default) or 3
Function  run time in seconds: 2.839, 2.933, 2.979
Procedure run time in seconds: 1.685, 1.700, 1.762

Inlining disabled: PLSQL_OPTIMIZE_LEVEL = 0 or 1
Function  run time in seconds:  5.164, 4.967, 5.632
Procedure run time in seconds: 6.1, 6.006, 6.037

위의 코드는 사소한 것으로, 다른 최적화의 영향을 받을 수 있습니다.하지만 나는 생산 코드와 비슷한 결과를 본 적이 있다.

차이가 중요하지 않은 이유

위의 테스트를 보고 "절차 실행 속도가 함수보다 두 배 빨라!"라고 생각하지 마십시오.예, 함수의 오버헤드는 프로시저 오버헤드의 거의 두 배입니다.하지만 어느 쪽이든 오버헤드는 무관하게 작습니다.

데이터베이스 성능의 핵심은 SQL 문에서 가능한 한 많은 작업을 일괄적으로 수행하는 것입니다.프로그램이 함수나 프로시저를 초당 천만 번 호출하면 그 프로그램은 심각한 설계상의 문제를 안고 있습니다.

상태 변경과 비상태 변경

Romo Daneghyan의 대답에 덧붙여, 나는 항상 프로그램 상태에서의 그들의 행동이라고 생각해 왔다., 개념적으로는

  • 절차에 따라 파라미터 또는 환경(테이블 내의 데이터 등) 중 하나의 상태가 변경될 수 있습니다.
  • 함수는 상태를 변경하지 않으며 특정 함수를 호출해도 데이터/상태는 변경되지 않습니다.(즉, 기능 프로그래밍의 기초가 되는 개념)

즉, ""라는 이름의 , ""는 ""라는 이름으로 호출된 입니다.generateId(...)약간의 계산만 하고 값을 반환할 것으로 예상됩니다. 프로시저를 하는 건generateId ...일부 테이블에서는 값이 변경될 수 있습니다.

물론 Oracle뿐만 아니라 많은 언어에서도 해당되지 않고 강제되지 않기 때문에 저만 그런 것 같습니다.

  1. 프로시저는 값을 반환할 수도 있고 반환하지 않을 수도 있지만 함수는 값을 반환합니다.

  2. 절차 use parameter returnvalue 목적이지만 함수 returnstatation이 제공합니다.

  3. 절차는 데이터 조작을 사용하지만 함수는 데이터 계산을 사용합니다.
  4. 절차실행시간이선택문을사용하지않고함수사용선택문을사용합니다.이것들은 그것의 큰 차이점이다.

이것은 훌륭한 질문이고 내가 알기로는 실제로 답을 얻지 못했다.문제는 "함수와 절차의 차이점은 무엇인가?"가 아닙니다.오히려 "기능을 가지고 같은 일을 할 수 있는데 왜 내가 절차를 사용하겠는가?"라는 것이다.

내 생각에 진짜 답은 "그냥 관례일 뿐이야"이다.그리고 이것은 관례이기 때문에 다른 개발자들이 익숙하고 기대하는 것이기 때문에 규칙을 따라야 합니다.그러나 함수에 대한 절차로 하위 프로그램을 작성할 기능적인 이유는 없습니다.한 가지 예외는 여러 개 있는 경우일 수 있습니다.OUT파라미터를 지정합니다.

Steven Feuerstein은 Oracle PL/SQL 프로그래밍 6번째 에디션에서 다음을 예약할 것을 권장합니다.OUT그리고.IN OUT절차에 대한 매개 변수와 RETURN 절(613페이지)을 통해 함수의 정보만 반환합니다.하지만 다시 말씀드리지만, 그 이유는 관습입니다.개발자는 기능이 다음과 같은 기능을 갖기를 기대하지 않습니다.OUT파라미터를 지정합니다.

어떤 기능이 작동하지 않을 때만 프로시저를 사용해야 한다고 주장하는 글을 여기에 길게 썼습니다.저는 개인적으로 기능을 선호하기 때문에 컨벤션이 기본적으로 기능을 사용했으면 좋겠다고 생각합니다만, 바꿀 수 없는 것은 받아들이고, 내가 원하는 것이 아니라 실제 컨벤션에 굴복하는 이 좋다고 생각합니다.

주요 차이점은 다음과 같습니다.

함수는 DML Statemnt를 포함할 수 없지만 프로시저는 포함할 수 있습니다.예를 들어 업데이트 및 삽입과 같이 입력합니다.

내가 틀렸다면 정정해 주세요

스토어 프로시저는 한 번 컴파일되어 컴파일 없이 몇 번이고 호출할 수 있는 것으로 알고 있습니다.그러나 함수는 호출할 때마다 컴파일됩니다.따라서 저장 절차는 기능보다 성능을 향상시킵니다.

언급URL : https://stackoverflow.com/questions/25419629/functions-vs-procedures-in-oracle

반응형