복붙노트

[SQL] 오라클의 다른와 저장 프로 시저를 호출

SQL

오라클의 다른와 저장 프로 시저를 호출

사람은 방법을 알고 있는가, 또는 그것의 가능한 경우, 또 다른 내에서 저장 프로 시저를 호출? 그렇다면, 당신은 그것을 어떻게 할 것인가?

여기에 내 테스트 코드는 다음과 같습니다

SET SERVEROUTPUT ON;

DROP PROCEDURE test_sp_1;
DROP PROCEDURE test_sp;

CREATE PROCEDURE test_sp
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Test works');
END;
/

CREATE PROCEDURE test_sp_1
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Testing');
    test_sp;
END;
/

CALL test_sp_1;

해결법

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

    1.귀하의 저장 프로 시저는 코딩 작업 할 수 있습니다. 문제는 당신의 저장 프로 시저 중 하나를 호출 할 수없는, 마지막 라인이다.

    귀하의 저장 프로 시저는 코딩 작업 할 수 있습니다. 문제는 당신의 저장 프로 시저 중 하나를 호출 할 수없는, 마지막 라인이다.

    SQL *의 세 가지 선택 플러스는 다음과 같습니다 전화, 간부 및 익명 PL / SQL 블록.

    호출은 SQL 키워드로 표시하고, SQL 참조 서에 설명되어 있습니다. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG 구문 다이어그램은 인수가 호출 루틴으로 전달되지 않은 경우에도, parentesis가 필요하다는 것을 나타냅니다.

    CALL test_sp_1();
    

    익명 PL / SQL 블록 등 명명 된 프로 시저, 함수, 트리거, 내부 당신의 프로 시저를 호출 할 수 있습니다되지 않도록 PL / SQL이다.

    BEGIN
        test_sp_1;
    END;
    /
    

    Exec은 위의 익명 블록에 대한 바로 가기 인 SQL * 플러스 명령입니다. EXEC 로 BEGIN DB 서버로 전달됩니다 ; 종료;

    전체 예 :

    SQL> SET SERVEROUTPUT ON
    SQL> CREATE OR REPLACE PROCEDURE test_sp 
      2  AS 
      3  BEGIN 
      4      DBMS_OUTPUT.PUT_LINE('Test works'); 
      5  END;
      6  /
    
    Procedure created.
    
    SQL> CREATE OR REPLACE PROCEDURE test_sp_1 
      2  AS
      3  BEGIN
      4      DBMS_OUTPUT.PUT_LINE('Testing'); 
      5      test_sp; 
      6  END;
      7  /
    
    Procedure created.
    
    SQL> CALL test_sp_1();
    Testing
    Test works
    
    Call completed.
    
    SQL> exec test_sp_1
    Testing
    Test works
    
    PL/SQL procedure successfully completed.
    
    SQL> begin
      2      test_sp_1;
      3  end;
      4  /
    Testing
    Test works
    
    PL/SQL procedure successfully completed.
    
    SQL> 
    
  2. ==============================

    2.물론, 당신은 특별한 구문은 없습니다의 SP 내에서 호출.

    물론, 당신은 특별한 구문은 없습니다의 SP 내에서 호출.

    전의:

       PROCEDURE some_sp
       AS
       BEGIN
          some_other_sp('parm1', 10, 20.42);
       END;
    

    절차가 실행 절차에있는 것과 다른 스키마에있는 경우, 당신은 스키마 이름으로 접두사해야합니다.

       PROCEDURE some_sp
       AS
       BEGIN
          other_schema.some_other_sp('parm1', 10, 20.42);
       END;
    
  3. ==============================

    3.SQLPLUS 명령 줄에서 프로 시저를 호출하려면 다음 중 하나를 수행하십시오 :

    SQLPLUS 명령 줄에서 프로 시저를 호출하려면 다음 중 하나를 수행하십시오 :

    CALL test_sp_1();
    EXEC test_sp_1
    
  4. ==============================

    4.@Michael 록우드는 - 당신은 키워드 "CALL"어디를 사용할 필요가 없습니다. 당신은 직접 프로 시저 호출을 언급 할 필요가있다.

    @Michael 록우드는 - 당신은 키워드 "CALL"어디를 사용할 필요가 없습니다. 당신은 직접 프로 시저 호출을 언급 할 필요가있다.

    그건

    Begin
       proc1(input1, input2);
    end;
    /
    

    대신에

    Begin
       call proc1(input1, input2);
    end;
    /
    
  5. ==============================

    5.다른 프로 시저에서 하나의 프로 시저를 호출 :

    다른 프로 시저에서 하나의 프로 시저를 호출 :

    정상적인 절차에 대한 하나의 :

    CREATE OR REPLACE SP_1() AS 
    BEGIN
    /*  BODY */
    END SP_1;
    

    SP_2에서 프로 시저 SP_1 호출 :

    CREATE OR REPLACE SP_2() AS
    BEGIN
    /* CALL PROCEDURE SP_1 */
    SP_1();
    END SP_2;
    

    REFCURSOR 또는 출력 커서가있는 프로 시저를 호출 :

    CREATE OR REPLACE SP_1
    (
    oCurSp1 OUT SYS_REFCURSOR
    ) AS
    BEGIN
    /*BODY */
    END SP_1;
    

    출력 매개 변수로 REFCURSOR을 반환 절차 SP_1 전화

    CREATE OR REPLACE SP_2 
    (
    oCurSp2 OUT SYS_REFCURSOR
    ) AS `enter code here`
    BEGIN
    /* CALL PROCEDURE SP_1 WITH REF CURSOR AS OUTPUT PARAMETER */
    SP_1(oCurSp2);
    END SP_2;
    
  6. from https://stackoverflow.com/questions/3415232/call-a-stored-procedure-with-another-in-oracle by cc-by-sa and MIT license