변수와 상수 선언 및 값 지정

Package Spec에 선언된 변수나 상수는 패키지에 액세스할 수 있는 모든 프로그램에서 사용할 수 있습니다. 패키지 본문이나 하위 프로그램에서 선언한 변수나 상수는 해당 패키지나 하위 프로그램에 로컬입니다. 상수를 선언할 때는 초기 값을 반드시 지정해야 합니다.

SQL에는 없는 PL/SQL의 중요한 장점 중 하나는 PL/SQL에서 변수와 상수를 선언할 수 있다는 것입니다.

Package Spec에 선언된 변수나 상수는 패키지에 액세스할 수 있는 모든 프로그램에서 사용할 수 있습니다. 패키지 본문이나 하위 프로그램에서 선언한 변수나 상수는 해당 패키지나 하위 프로그램에 로컬입니다.

변수는 특정 데이터 유형의 값을 보유합니다. 프로그램은 런타임에 이 값을 변경할 수 있습니다. 상수는 변경할 수 없는 값을 보유합니다.

변수나 상수는 임의의 PL/SQL 데이터 형식일 수 있습니다. 변수를 선언할 때 변수에 초기 값을 지정할 수 있습니다. 그렇게 하지 않으면 초기 값은 NULL입니다. 상수를 선언할 때는 초기 값을 반드시 지정해야 합니다. 변수나 상수에 초기 값을 지정하려면 지정 연산자(:=)를 사용합니다.

팁: 변경되지 않은 값은 모두 상수로 선언합니다. 이렇게 하면 컴파일된 코드가 최적화되고 소스 코드를 더욱 쉽게 유지 관리할 수 있습니다.

참조: 변수 및 상수에 대한 일반적인 정보는 Oracle Database PL/SQL Language Reference

자습서: 하위 프로그램에서 변수 및 상수 선언

이 자습서에서는 EMP_EVAL.CALCULATE_SCORE 함수에서 변수와 상수를 선언하기 위해 SQL Developer 툴 편집을 사용하는 방법을 보여줍니다. 또한 패키지 본문을 변경하는 예도 제공됩니다.

EMP_EVAL.CALCULATE_SCORE 함수는 "자습서: 패키지 사양 생성"에 명시되어 있습니다.

CALCULATE_SCORE 함수에서 변수와 상수를 선언하는 단계는 다음과 같습니다.

  1. Connections(연결) 프레임에서 hr_conn을 확장합니다.

  2. 스키마 객체 유형 목록에서 패키지를 확장합니다.

  3. 패키지 목록에서 EMP_EVAL을 확장합니다.

  4. 선택 항목 목록에서 EMP_EVAL 본문을 마우스 오른쪽 버튼으로 누릅니다.

    선택 사항 목록이 나타납니다.

  5. 선택 항목 목록에서 편집을 선택합니다.

    EMP_EVAL Body 창이 나타나고 패키지 본문의 코드가 표시됩니다.

     CREATE OR REPLACE
     PACKAGE BODY EMP_EVAL AS
    
       PROCEDURE eval_department ( dept_id IN NUMBER ) AS
    
       BEGIN
    
         -- TODO implementation required for PROCEDURE EMP_EVAL.eval_department
         NULL;
       END eval_department;
    
       FUNCTION calculate_score ( evaluation_id IN NUMBER
                               , performance_id IN NUMBER)
                               RETURN NUMBER AS
       BEGIN
    
         -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
         RETURN NULL;
       END calculate_score;
    
     END EMP_EVAL;
    
  6. RETURN NUMBER ASBEGIN 사이에 다음 변수 및 상수 선언을 추가합니다.

     n_score       NUMBER(1,0);                -- variable
     n_weight      NUMBER;                     -- variable
     max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
    
     max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
    
     The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database.
    
  7. [파일] 메뉴에서 저장을 선택합니다.

    Oracle Database에서 변경된 패키지 본문을 컴파일하고 저장합니다. EMP_EVAL 본문 창의 제목은 더 이상 기울임꼴이 아님.

참조:

값, 상수 및 매개변수에 정확한 데이터 유형 지정

변수, 상수 및 파라미터를 %TYPE 속성으로 선언하여 해당 데이터 유형이 올바른지 확인합니다.

"자습서: 하위 프로그램에서 변수 및 상수 선언"을 마치면 EMP_EVAL.CALCULATE_SCORE 함수의 코드는 다음과 같습니다:

FUNCTION calculate_score ( evaluation_id IN NUMBER
                          , performance_id IN NUMBER )
                          RETURN NUMBER AS
  n_score       NUMBER(1,0);                -- variable
  n_weight      NUMBER;                     -- variable
  max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
  max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
  BEGIN
    -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
    RETURN NULL;
  END calculate_score;

함수의 변수, 상수 및 매개변수는 "테이블 생성"에서 생성된 SCORES 및 PERFORMANCE_PARTS 테이블의 값을 나타냅니다.

따라서 각 변수, 상수 및 매개변수는 해당하는 열과 같은 데이터 유형을 가집니다.

열의 데이터 유형이 변경되면 변수, 상수 및 파라미터의 데이터 유형을 동일한 데이터 유형으로 변경해야 하며 그렇지 않으면 CALCULATE_SCORE 함수가 무효화됩니다.

변수, 상수 및 매개변수의 데이터 유형이 항상 열의 데이터 유형 및 항상 일치하도록 하려면 %TYPE 속성을 사용하여 선언합니다. %TYPE 속성은 테이블 열이나 다른 변수의 데이터 유형을 제공하므로 데이터 유형이 올바로 지정되도록 합니다.

참조:

자습서: %TYPE 속성을 사용하도록 선언 변경

이 자습서에서는 SQL Developer 툴 편집을 사용하여 EMP_EVAL.CALCULATE_SCORE 함수의 변수를 선언 및 상수 및 정식 매개변수 선언을 %TYPE 속성을 사용하는 선언로 변경하는 방법을 보여 줍니다.

EMP_EVAL.CALCULATE_SCORE 함수는 "자습서: 서브 프로그램에서 변수 및 상수 선언"에 나와 있습니다.

%TYPE을 사용하도록 CALCULATE_SCORE의 선언을 변경하는 단계:

  1. Connections(연결) 프레임에서 hr_conn을 확장합니다.

  2. 스키마 객체 유형 목록에서 패키지를 확장합니다.

  3. 패키지 목록에서 EMP_EVAL을 확장합니다.

  4. 선택 항목 목록에서 EMP_EVAL 본문을 마우스 오른쪽 버튼으로 누릅니다.

  5. 선택 항목 목록에서 편집을 선택합니다.

    EMP_EVAL Bodypane이 나타나고 패키지 본문의 코드가 표시됩니다.

     CREATE OR REPLACE
     PACKAGE BODY emp_eval AS
    
       PROCEDURE eval_department ( dept_id IN NUMBER ) AS
       BEGIN
    
         -- TODO implementation required for PROCEDURE EMP_EVAL.eval_department
         NULL;
       END eval_department;
    
       FUNCTION calculate_score ( evaluation_id IN NUMBER
                               , performance_id IN NUMBER )
                               RETURN NUMBER AS
       n_score       NUMBER(1,0);                -- variable
       n_weight      NUMBER;                     -- variable
       max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
    
       max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
    
       BEGIN
    
         -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
         RETURN NULL;
       END calculate_score;
    
     END emp_eval;
    
  6. 함수 코드에서 다음과 같이 변경합니다.

     FUNCTION calculate_score ( evaluation_id IN SCORES.EVALUATION_ID%TYPE
                               , performance_id IN SCORES.PERFORMANCE_ID%TYPE)
                               RETURN NUMBER AS
     n_score       SCORES.SCORE%TYPE;
     n_weight      PERFORMANCE_PARTS.WEIGHT%TYPE;
     max_score     CONSTANT SCORES.SCORE%TYPE := 9;
     max_weight    CONSTANT PERFORMANCE_PARTS.WEIGHT%TYPE := 1;
    
  7. EMP_EVAL을 마우스 오른쪽 버튼으로 누릅니다.

  8. 선택 항목 목록에서 편집을 선택합니다.

    EMP_EVAL 창이 열리고 이 패키지를 생성한 CREATE PACKAGE 문을 표시합니다.

     CREATE OR REPLACE PACKAGE EMP_EVAL AS
    
     PROCEDURE eval_department(dept_id IN NUMBER);
     FUNCTION calculate_score(evaluation_id IN NUMBER
                             , performance_id IN NUMBER)
                               RETURN NUMBER;
    
     END EMP_EVAL;
    
  9. 함수 코드에서 다음과 같이 변경합니다.

     FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE
                             , performance_id IN scores.performance_id%TYPE)
    
  10. EMP_EVAL을 마우스 오른쪽 버튼으로 누릅니다.

  11. 선택 항목 목록에서 컴파일을 선택합니다.

  12. EMP_EVAL 본문을 마우스 오른쪽 버튼으로 누릅니다.

  13. 선택 항목 목록에서 컴파일을 선택합니다.

변수에 값 지정

다음과 같은 방법으로 변수에 값을 지정할 수 있습니다.

참조:

지정 연산자를 사용하여 변수에 값 지정

하위 프로그램의 선언 또는 실행 부분에서 지정 연산자(:=)를 사용하여 변수에 표현식의 값을 지정할 수 있습니다.

하위 프로그램의 선언 부분에서는 변수를 선언할 때 변수에 초기 값을 지정할 수 있으며, 구문은 다음과 같습니다.

variable_name data_type := expression;

하위 프로그램의 실행 부분에서는 지정 명령문을 사용하여 변수에 값을 지정할 수 있으며, 구문은 다음과 같습니다.

variable_name := expression;

예 5-1에서는 EMP_EVAL.CALCULATE_SCORE 함수를 변경하여 running_total 변수를 추가하고 해당 변수를 함수의 반환 값으로 사용합니다. 지정 연산자는 함수의 선언 및 실행 부분에 모두 나옵니다. run_total 데이터 유형은 자릿수와 소수점 이하 자릿수가 다른 두 NUMBER 값의 곱을 보유하므로 데이터 유형이 SCORES.SCORE%TYPE 또는 PERFORMANCE_PARTS.WEIGHT%TYPE이 아닌 NUMBER여야 합니다.

참조:

예 5-1 지정 연산자를 사용하여 변수에 값 지정

FUNCTION calculate_score(evaluation_id IN SCORES.EVALUATION_ID%TYPE
                         , performance_id IN SCORES.PERFORMANCE_ID%TYPE)
                         RETURN NUMBER AS
  n_score       SCORES.SCORE%TYPE;
  n_weight      PERFORMANCE_PARTS.WEIGHT%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT SCORES.SCORE%TYPE := 9;
  max_weight    CONSTANT PERFORMANCE_PARTS.WEIGHT%TYPE:= 1;
BEGIN
  running_total := max_score * max_weight;
  RETURN running_total;
END calculate_score;

SELECT INTO 문을 사용하여 변수에 값 지정

하위 프로그램 또는 패키지에서 테이블 값을 사용하려면 SELECT INTO 문을 사용하여 변수에 이러한 가치를 지정해야 합니다. 예 5-2에서는 EMP_EVAL.CALCULATE_SCORE 함수에서 running_total을 테이블 값에서 계산하도록 변경한 내용을 표시합니다.

예 5-3의 ADD_EVAL 프로시저는 EMPLOYEES 테이블에서 해당하는 행의 값을 사용하여 EVALUATIONS 테이블에 행을 삽입합니다. ADD_EVAL 프로시저를 EMP_EVAL 패키지의 본문에 추가하되 사양에는 추가하지 않습니다. ADD_EVAL은 사양에 없으므로 패키지의 로컬입니다. 즉, 패키지 외부에서는 호출 할 수 없고 패키지의 다른 하위 프로그램에서만 호출할 수도 있습니다.

참조: SELECT INTO 문에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참조하십시오

예제 5-2 SELECT INTO를 사용하여 변수에 테이블 값 지정

FUNCTION calculate_score ( evaluation_id IN scores.evaluation_id%TYPE
                         , performance_id IN scores.performance_id%TYPE )
                         RETURN NUMBER AS

  n_score       scores.score%TYPE;
  n_weight      performance_parts.weight%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT scores.score%TYPE := 9;
  max_weight    CONSTANT performance_parts.weight%TYPE:= 1;
BEGIN
  SELECT s.score INTO n_score
  FROM SCORES s
  WHERE evaluation_id = s.evaluation_id
  AND performance_id = s.performance_id;

  SELECT p.weight INTO n_weight
  FROM PERFORMANCE_PARTS p
  WHERE performance_id = p.performance_id;

  running_total := n_score * n_weight;
  RETURN running_total;
END calculate_score;

예제 5-3 다른 테이블의 값을 포함하는 테이블 행 삽입

PROCEDURE add_eval ( employee_id IN EMPLOYEES.EMPLOYEE_ID%TYPE
                   , today IN DATE )
AS
  job_id         EMPLOYEES.JOB_ID%TYPE;
  manager_id     EMPLOYEES.MANAGER_ID%TYPE;
  department_id  EMPLOYEES.DEPARTMENT_ID%TYPE;
BEGIN
  INSERT INTO EVALUATIONS (
    evaluation_id,
    employee_id,
    evaluation_date,
    job_id,
    manager_id,
    department_id,
    total_score
  )
  SELECT
    evaluations_sequence.NEXTVAL,   -- evaluation_id
    add_eval.employee_id,      -- employee_id
    add_eval.today,            -- evaluation_date
    e.job_id,                  -- job_id
    e.manager_id,              -- manager_id
    e.department_id,           -- department_id
    0                          -- total_score
  FROM employees e;

  IF SQL%ROWCOUNT = 0 THEN
    RAISE NO_DATA_FOUND;
  END IF;
END add_eval;