변수와 상수 선언 및 값 지정
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 함수에서 변수와 상수를 선언하는 단계는 다음과 같습니다.
-
Connections(연결) 프레임에서 hr_conn을 확장합니다.
-
스키마 객체 유형 목록에서 패키지를 확장합니다.
-
패키지 목록에서 EMP_EVAL을 확장합니다.
-
선택 항목 목록에서 EMP_EVAL 본문을 마우스 오른쪽 버튼으로 누릅니다.
선택 사항 목록이 나타납니다.
-
선택 항목 목록에서 편집을 선택합니다.
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; -
RETURN NUMBER AS및BEGIN사이에 다음 변수 및 상수 선언을 추가합니다.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 1The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database. -
[파일] 메뉴에서 저장을 선택합니다.
Oracle Database에서 변경된 패키지 본문을 컴파일하고 저장합니다. EMP_EVAL 본문 창의 제목은 더 이상 기울임꼴이 아님.
참조:
-
변수 및 상수 선언에 대한 일반 정보는 Oracle Database PL/SQL Language Reference를 참조하십시오.
값, 상수 및 매개변수에 정확한 데이터 유형 지정
변수, 상수 및 파라미터를 %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 테이블의 값을 나타냅니다.
-
n_score 변수는 SCORE.SCORES 열의 값을 보유하면 max_score 상수와 이러한 값을 비교합니다.
-
n_weight 변수는 PERFORMANCE_PARTS.WEIGHT 열의 값을 보유하면 max_weight 상수와 이러한 값을 비교합니다.
-
evaluation_id 매개변수는 SCORE.EVALUATION_ID 열에 있는 값을 보유합니다.
-
performance_id 매개변수는 SCORE.PERFORMANCE_ID 열의 값을 보유합니다.
따라서 각 변수, 상수 및 매개변수는 해당하는 열과 같은 데이터 유형을 가집니다.
열의 데이터 유형이 변경되면 변수, 상수 및 파라미터의 데이터 유형을 동일한 데이터 유형으로 변경해야 하며 그렇지 않으면 CALCULATE_SCORE 함수가 무효화됩니다.
변수, 상수 및 매개변수의 데이터 유형이 항상 열의 데이터 유형 및 항상 일치하도록 하려면 %TYPE 속성을 사용하여 선언합니다. %TYPE 속성은 테이블 열이나 다른 변수의 데이터 유형을 제공하므로 데이터 유형이 올바로 지정되도록 합니다.
참조:
-
%TYPE속성에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참조하십시오. -
%TYPE 속성의 구문은 Oracle Database PL/SQL Language Reference
자습서: %TYPE 속성을 사용하도록 선언 변경
이 자습서에서는 SQL Developer 툴 편집을 사용하여 EMP_EVAL.CALCULATE_SCORE 함수의 변수를 선언 및 상수 및 정식 매개변수 선언을 %TYPE 속성을 사용하는 선언로 변경하는 방법을 보여 줍니다.
EMP_EVAL.CALCULATE_SCORE 함수는 "자습서: 서브 프로그램에서 변수 및 상수 선언"에 나와 있습니다.
%TYPE을 사용하도록 CALCULATE_SCORE의 선언을 변경하는 단계:
-
Connections(연결) 프레임에서 hr_conn을 확장합니다.
-
스키마 객체 유형 목록에서 패키지를 확장합니다.
-
패키지 목록에서 EMP_EVAL을 확장합니다.
-
선택 항목 목록에서 EMP_EVAL 본문을 마우스 오른쪽 버튼으로 누릅니다.
-
선택 항목 목록에서 편집을 선택합니다.
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; -
함수 코드에서 다음과 같이 변경합니다.
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; -
EMP_EVAL을 마우스 오른쪽 버튼으로 누릅니다.
-
선택 항목 목록에서 편집을 선택합니다.
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; -
함수 코드에서 다음과 같이 변경합니다.
FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE , performance_id IN scores.performance_id%TYPE) -
EMP_EVAL을 마우스 오른쪽 버튼으로 누릅니다.
-
선택 항목 목록에서 컴파일을 선택합니다.
-
EMP_EVAL 본문을 마우스 오른쪽 버튼으로 누릅니다.
-
선택 항목 목록에서 컴파일을 선택합니다.
변수에 값 지정
다음과 같은 방법으로 변수에 값을 지정할 수 있습니다.
-
지정 연산자를 사용하여 변수에 표현식의 값을 지정합니다.
-
SELECT INTO 또는 FETCH 문을 사용하여 변수에 테이블의 값을 지정합니다.
-
변수를 하위 프로그램에 OUT 또는 IN OUT 매개변수로 전달한 다음 하위 프로그램 내에서 값을 지정합니다.
-
변수를 값에 바인드합니다.
참조:
-
Oracle Database PL/SQL Language Reference for more information about assigning values to variables
-
변수 바인딩에 대한 자세한 내용은 Oracle Database 2 Day + Java Developer's Guide를 참조하십시오.
지정 연산자를 사용하여 변수에 값 지정
하위 프로그램의 선언 또는 실행 부분에서 지정 연산자(:=)를 사용하여 변수에 표현식의 값을 지정할 수 있습니다.
하위 프로그램의 선언 부분에서는 변수를 선언할 때 변수에 초기 값을 지정할 수 있으며, 구문은 다음과 같습니다.
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여야 합니다.
참조:
-
변수 선언 구문은 Oracle Database PL/SQL Language Reference를 참조하십시오
-
지정 명령문 구문에 대한 Oracle Database PL/SQL Language Reference
예 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;