Microsoft Word - 05_SUBPROGRAM.doc

Similar documents
Microsoft Word - 04_EXCEPTION.doc

13주-14주proc.PDF

Microsoft Word - 03_SQL_CURSOR.doc

Microsoft Word - PLSQL.doc

Microsoft Word - 02_PLSQL_BLOCK_STRUCTURE.doc

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

歯PLSQL10.PDF

ESQL/C

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

(Microsoft Word - PLSQL\300\314\266\365.doc)

ALTIBASE HDB Patch Notes

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

Microsoft PowerPoint - PLSQL.ppt

Microsoft PowerPoint - PLSQL.ppt

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

[ 목차 ] 5.1 데이터베이스프로그래밍개념 5.2 T-SQL T-SQL 문법 5.3 JAVA 프로그래밍 2

강의 개요

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Presentation

MySQL-.. 1

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 (

Microsoft Word - 07_TRIGGER.doc

Microsoft PowerPoint - additional01.ppt [호환 모드]

Spring Boot/JDBC JdbcTemplate/CRUD 예제

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

DBMS & SQL Server Installation Database Laboratory

단답형 (26 회기출문제 ) 1. 아래와같은테이블이있을때아래의 SQL 결과에대해서 Oracle, SQL Server 순서로적으시오 TAB1 COL1 CHAR(10) COL2 CHAR(10) INSERT INTO TAB1 VALUES ('1',''); INSERT INT

PowerPoint Presentation

제4장 기본 의미구조 (Basic Semantics)

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

슬라이드 제목 없음

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap06-5 [호환 모드]

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

윈도우시스템프로그래밍

6장. SQL

10.ppt

Microsoft Word - SQL튜닝_실습교재_.doc

Microsoft PowerPoint 세션.ppt

슬라이드 1

슬라이드 1

PostgreSQL 2 Uniersity of California at Berkeley ( ) 에서개발된관계형데이터베이스서버인 Ingres 가시초 ( 후에 Computer Associates 에인수됨 ) 1

슬라이드 1

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

FlashBackt.ppt

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770>

Jerry Held


Microsoft PowerPoint - e pptx

Commit_Wait / Commit_Logging 두파라미터를통해 Log File Sync 대기시간을감소시킬수있다는것은놀라움과의아함을동시에느낄수있다. 단지파라미터의수정을통해당연히대기해야하는시간을감축한다는것은분명성능을개선해야하는입장에서는놀라운일이될것이다. 반면, 그에따

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

슬라이드 1

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Lab 3. 실습문제 (Single linked list)_해답.hwp

TITLE

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

1. 데이터베이스프로그래밍의개념 2. PL-SQL 3. 데이터베이스연동자바프로그래밍 4. 데이터베이스연동웹프로그래밍

PowerPoint Presentation

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

PowerPoint 프레젠테이션

문서 템플릿

C++ Programming

Microsoft PowerPoint 웹 연동 기술.pptx

SQL Tuning Business Development DB

OCW_C언어 기초

Microsoft PowerPoint - chap06-1Array.ppt

untitled

歯sql_tuning2

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

Visual Basic 반복문

adfasdfasfdasfasfadf

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

最即時的Sybase ASE Server資料庫診斷工具

제목을 입력하세요.

RDB개요.ppt

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - QVIZMVUMWURI.pptx

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

untitled

PowerPoint 프레젠테이션

Cluster management software

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

슬라이드 1

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 10Àå.ppt

뇌를자극하는 SQL Server 2012 (1 권 ) 1 권 : 기본편 < 이것만은알고갑시다 > 모범답안 1 장 1. (1) Microsoft (2) Oracle (3) IBM (4) Oracle (5) Micr

Microsoft PowerPoint - [2009] 02.pptx

윈도우즈프로그래밍(1)

C 프로그램의 기본

17장 클래스와 메소드

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

Transcription:

ORACLE SUBPROGRAM INTRODUCTION PLSQL 은오라클에서제공하는프로그래밍언어이다. 이는데이터베이스언어인 SQL 과함께효과적으로데이터베이스에접근할수있는방법을제공하고있다. Procedural LanguageSQL 의약자에서볼수있듯이절차적인기능을기본적으로가지는프로그래밍언어이다. PLSQL 은기본적으로블록 (BLOCK) 구조를가지고있다. 블록의기본적인구성은선언부 (DECLARE), 실행부 (), 예외처리부 (EXCEPTION) 로구성되어있다. PLSQL 블록은그블록안에블록을포함할수있는데포함된블록을 Nested Block 이라한다. PLSQL 블록은데이터베이스에오브젝트로서저장될수있는데, 이를서브프로그램또는프로그램단위라부르며, 그유형은프로시저 (Procedure), 함수 (Function), 패키지 (Package), 트리거 (Trigger) 로저장될수있다. 이장에서는프로시저와함수에대해서만다루기로한다. 서브프로그램단위로절차적인처리를하게되면, 중앙집중적인유지관리를할수있고데이터보안또는무결성을강화할수있으며, 데이터베이스내에저장되어재번역없이도실행할수있으므로성능또한높일수있다. 모듈화개발이가능하여개발의용이함을갖게된다. SOURCE Complie PARSE RUN Code Code Compliation Error Run-time Error(Exception) Written by AngelaLEE 5-1 www.muhanedu.net

PROCEDURE 프로시저는특정처리를실행하는서브프로그램의한유형으로단독 (standalone) 으로실행되거나다른프로시저또는다른툴 (Oracle Developer ) 또는다른환경 (Pro*C ) 등에서호출되어실행될수있다. 오브젝트로서데이터베이스내에저장되며, 호출되어실행될때별도의컴파일없이생성된 p-code 로바로실행할수있다. 오브젝트로 DDL 문으로처리된다. 프로시저를생성하고자한다면 CREATE PROCEDURE 문, 삭제하고자한다면 DROP PROCEDURE 문을사용한다. 프로시저를다시컴파일하고자한다면 ALTER PROCEDURE 문을사용한다. 프로시저를생성하는문법은아래와같다. > SYNTAX: CREATE [OR REPLACE] PROCEDURE procedure_name [( parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, )] AS PLSQL Block ; OR REPLACE 생성하고자하는프로시저가기존에동일명으로존재할경우, 기존의내용을현재의내용으로수정하는옵션.( 만약기존에존재하지않는다면큰의미는없다.) procedure_name 생성하고자하는프로시저명으로스키마내에서는유일하게명명되어야한다. Parameter 프로시저를실행할때호출환경과프로시저간에값을주고받을때사용되는파라미터 ( 매개변수 ) 로모드에따라역할이다르게수행된다. 파라미터를선언할때는데이터형만을기술한다. Written by AngelaLEE 5-2 www.muhanedu.net

( 데이터의크기는기술하지않음에유의한다.) 프로시저를생성할때선언된매개변수를형식매개변수 (Formal Parameter) 라고하며, 프로시저를실행할때형식매개변수에실제값이나변수를할당 대응하는데이때이를실매개변수 (Actual Parameter) 라고한다. 매개변수를선언할때 DEFAULT 키워드를사용하여기본값을부여할수있다.( 즉, 디폴트파라미터를지정할수있다 ) Mode 모드는매개변수의역할을결정짓는것으로 3가지가있다. IN 모드는호출환경으로부터값을전달받는매개변수로설정하며, IN 모드로설정된매개변수는프로시저내에서는읽기전용지역변수처럼취급된다. 기본 (Default) 모드이므로생략이가능하다. OUT 모드는프로시저에서호출환경으로값을전달하는매개변수로설정하며, 이모드로설정된매개변수는프로시저내에서는읽을수없으며, 값을저장하기만하는지역변수처럼사용된다. 호출환경에서는이매개변수로부터값을전달받기위해환경변수가선언되어야한다. IN OUT 모드로설정된매개변수는호출환경과프로시저간에값을주고받는지역변수로사용된다. 읽기도쓰기도가능하다. Written by AngelaLEE 5-3 www.muhanedu.net

FUNCTION 함수 (FUNCTION) 는프로시저와마찬가지로특정처리를위한서브프로그램의한유형이며, 데이터베이스내에오브젝트로서저장된다. 하지만함수는함수의이름으로반드시하나의값을리턴해야한다. 즉함수는실행이종료되면리턴데이터유형에맞는값으로대치되기때문에, 호출하고자한다면반드시수식의일부로서실행된다. 다른프로시저 함수또는다른툴 (Oracle Developer ) 또는다른환경 (Pro*C ) 등에서호출되어실행될수있다. 생성된함수 (User-defined Function) 는오라클단일행함수처럼 SQL 문과함께사용된다. 그러나, 만약 DML 문을가지는함수가동일한테이블에대한 UPDATEDELETE 문에포함되어처리될때, 상호참조 (Mutating Error) 가발생되므로제대로실행되지못하게된다. 또한 SQL 문에포함된함수는트랜잭션을종료시키는명령을포함하지못한다. 오브젝트로서 DDL 문으로처리된다. 함수를생성하고자한다면 CREATE FUNCTION 문, 삭제하고자한다면 DROP FUNCTION 문을사용한다. 함수를다시컴파일하고자한다면 ALTER PROCEDURE 문을사용한다. 함수를생성하는문법은아래와같다. > SYNTAX: CREATE [OR REPLACE] FUNCTION function_name [( parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, )] RETURN datatype AS PLSQL Block ; OR REPLACE 생성하고자하는함수가기존에동일명으로존 Written by AngelaLEE 5-4 www.muhanedu.net

재할경우, 기존의내용을현재의내용으로수정하는옵션.( 만약기존에존재하지않는다면큰의미는없다.) function_name 생성하고자하는함수명으로스키마내에서는유일해야한다. Parameter 함수를실행할때호출환경과함수간에값을주고받을때사용되는파라미터 ( 매개변수 ) 로모드에따라역할이다르게수행된다. ( 프로시저의파라미터와동일한의미이므로앞부분을참조하기바란다.) 매개변수를선언할때 DEFAULT 키워드를사용하여기본값을부여할수있다.( 즉, 디폴트파라미터를지정할수있다 ) Mode 모드는매개변수의역할을결정짓는것으로 3가지가있다. ( 자세한내용은앞부분프로시저의 mode 를참조하기바란다.) 한가지주지해야할사항은 ( 함수정의를확실히이해했다면 ) 함수의매개변수를사용할때, OUT 또는 IN OUT 모드는지양하는것이바람직하다는것이다. RETURN datatype 함수명으로리턴할데이터 ( 값 ) 의형을선언하는절. PLSQL 블록내에서는반드시 RETURN 문을포함해야하며, 그때리턴되는데이터는이부분에서선언한데이터형과일치되어야한다. Written by AngelaLEE 5-5 www.muhanedu.net

실습 ORACLE SUBPROGRAM 0. 사전준비사항 아래의실습예제들은각각스크립트파일에저장한다. ( 예를들면, 5 장의 1 번예제라면, p05_01.sql 로저장한다.) 저장된스크립트화일을실행하기위해서는 start 또는 @ 를사용한다. 만약 compile(parse) 후에러가있었다면, show errors 명령으로확인하여적절한조치를취하도록한다. 해당에러부분을수정한후에는다시스크립트를실행하여결과를확인한다. 1. [PROCEDURE I ] 사번을입력받아그사원의이름과급여를출력하는 EMP_INFO_01 프로시저. CREATE OR REPLACE PROCEDURE EMP_INFO_01 (P_ENO EMP.EMPNO%TYPE) V_ENAME EMP.ENAME%TYPE ; V_SAL EMP.SAL%TYPE ; SELECT INTO FROM ENAME, SAL V_ENAME, V_SAL EMP WHERE EMPNO = P_ENO ; DBMS_OUTPUT.PUT_LINE ( 사원의이름은 V_ENAME ) ; DBMS_OUTPUT.PUT_LINE ( 사원의급여는 V_SAL ) ; END ; 위의 CREATE PROCEDURE 문장은프로시저를생성한다. 생성된프로시저를 SQL*Plus(iSQL*Plus) 에서실행하기위해서는 EXECUTE 문을사용한다. SQL> EXECUTE EMP_INFO_01(7654) 참고적으로실행전에 SQL> SET SERVEROUTPUT ON 을실행한다. Written by AngelaLEE 5-6 www.muhanedu.net

2. [PROCEDURE II ] 1 번 EMP_INFO 프로시저를사원의이름과급여를화면출력하지않고매개변수를통해실행환경으로전달할수있도록수정한 EMP_INFO_02 프로시저. CREATE OR REPLACE PROCEDURE EMP_INFO_02 (P_ENO IN EMP.EMPNO%TYPE, P_ENAME OUT EMP.ENAME%TYPE, P_SAL OUT EMP.SAL%TYPE ) SELECT INTO FROM ENAME, SAL P_ENAME, P_SAL EMP WHERE EMPNO = P_ENO ; END ; 생성된프로시저를 SQL*Plus(iSQL*Plus) 에서실행 확인하는스크립트의내용 ( 별도로저장한다. 예를들면,p0502_run.sql ) VARIABLE G_ENAME VARCHAR2(30) VARIABLE G_SAL NUMBER EXEC EMP_INFO_02(7654, :G_ENAME, :G_SAL) PRINT G_ENAME PRINT G_SAL 참고적으로실행전에 SQL> SET SERVEROUTPUT ON 을실행한다. Written by AngelaLEE 5-7 www.muhanedu.net

3. [PROCEDURE III ] 전화번호문자열을받아들여포맷출력하는 PRN_TEL 프로시저. CREATE OR REPLACE PROCEDURE PRN_TEL (P_TEL_NO IN OUT VARCHAR2) P_TEL_NO := ( SUBSTR(P_TEL_NO,1,INSTR(P_TEL_NO,,1,1) 1 ) END ; ) SUBSTR(P_TEL_NO, INSTR(P_TEL_NO,,1,1)+1, INSTR(P_TEL_NO,,1,2)-1) - SUBSTR(P_TEL_NO, INSTR(P_TEL_NO,,1,2)+1) ; 생성된프로시저를 SQL*Plus(iSQL*Plus) 에서실행 확인하는스크립트의내용 ( 별도로저장한다. 예를들면,p0503_run.sql ) VARIABLE G_TEL_NO VARCHAR2(30) EXECUTE :G_TEL_NO := 012 345 6789 PRINT G_TEL_NO EXEC PRN_TEL(:G_TEL_NO) PRINT G_TEL_NO 결과가 012 345 6789 (012)345-6789 로출력되는가? ( 만약, 아니라면어떻게수정하나요?) Written by AngelaLEE 5-8 www.muhanedu.net

4. [PROCEDURE IV ] 디폴트형식파라미터를가지는 DFT_PARAM 프로시저. CREATE OR REPLACE PROCEDURE DFT_PARAM (P_DNAME IN DEPT.DNAME%TYPE DEFAULT Unknown, P_LOC IN DEPT.LOC%TYPE DEFAULT Unknown ) INSERT INTO DEPT VALEUS (SEQ_DNO.NEXTVAL, P_DNAME, P_LOC) ; COMMIT ; END ; 생성된프로시저를 SQL*Plus(iSQL*Plus) 에서실행 확인하는스크립트의내용. ( 별도로저장한다. 예를들면,p0504_run.sql ) DFT_PARAM ; DFT_PARAM( HAPPINESS, CIEL ) ; DFT_PARAM(P_LOC => SEOUL, P_DNAME => SMILE ) ; DFT_PARAM(P_LOC => PEACE ) ; END ; SELECT DEPTNO, DNAME, LOC FROM EMP ; SELECT COUNT(*) FROM EMP WHERE LOC = Unknown ; 문장의결과는? * 참고적으로 SEQ_DNO 는시퀀스이며, 없는경우에는 50 부터 10 씩증가하도록시퀀스를생성한후프로시저를실행한다. CREATE SEQUENCE SEQ_DNO INCREMENT BY 10 START WITH 50 MAXVALUE 99 ; Written by AngelaLEE 5-9 www.muhanedu.net

5. [PROCEDURE V ] 선언부에선언된지역프로시저를가지는 SAM_LOCAL 프로시저. CREATE OR REPLACE PROCEDURE sam_local (P_NO IN EMP.EMPNO%TYPE) PROCEDURE log_exec INSERT INTO log_table(user_id, log_date) VALUES (USER, SYSDATE) ; END log_exec ; DELETE EMP WHERE EMPNO = P_NO ; log_exec ; END sam_local ; 참고 : log_table 은두개의컬럼을갖는테이블임. log_exec 프로시저는 sam_local 내에선언된지역서브프로그램으로외부에서는호출할수없다. 지역서브프로시저는선언부에마지막에오도록한다. 다른프로시저에서 sam_local 프로시저를호출하든지또는 sam_local 내에서 log_exec 프로시저를호출하든지간에별도의명령없이프로시저명을기술하면된다.( 위의예에서는 log_exec ; ) Written by AngelaLEE 5-10 www.muhanedu.net

6. [FUNCTION I ] 해당부서의현재사원수를. 구하는 EMP_CNT 함수. CREATE OR REPLACE FUNCTION EMP_CNT (P_DNO IN DEPT.DEPTNO%TYPE) RETURN NUMBER V_CNT NUMBER ; SELECT COUNT(*) INTO V_CNT FROM EMP WHERE DEPTNO = P_DNO ; RETURN V_CNT ; END EMP_CNT ; 생성된함수를 SQL*Plus(iSQL*Plus) 에서실행 확인하는스크립트의내용. ( 별도로저장한다. 예를들면,p0506_run.sql ) VARIABLE G_CNT VARCHAR2(30) EXECUTE :G_CNT := EMP_CNT(20) PRINT G_CNT 생성된함수는오라클단일행함수와비슷하게사용된다. 예를들면, SELECT DEPTNO, DNAME, EMP_CNT(DEPTNO) FROM DEPT ; Written by AngelaLEE 5-11 www.muhanedu.net

7. [FUNCTION II ] 해당사원의급여와세율을입력받아세금을구하는 TAX 함수. CREATE OR REPLACE FUNCTION TAX (P_SAL IN EMP.SAL%TYPE, P_RATE IN NUMBER ) RETURN NUMBER RETURN ( P_SAL * P_RATE ) ; END EMP_CNT ; 생성된함수를 SQL*Plus(iSQL*Plus) 에서실행 확인하는스크립트의내용. ( 별도로저장한다. 예를들면,p0507_run.sql ) VARIABLE G_TAX NUMBER EXECUTE :G_TAX := TAX(4000, 0.05) PRINT G_CNT 생성된함수는오라클단일행함수와비슷하게사용된다. 예를들면, SELECT EMPNO, ENAME, SAL, TAX(SAL, 0.03) FROM EMP ; Written by AngelaLEE 5-12 www.muhanedu.net

8. [FUNCTION III ] 부서코드의유효여부를판단하는 VALID_DNO 함수. CREATE OR REPLACE FUNCTION VALID_DNO (P_DNO DEPT.DEPTNO%TYPE ) RETURN BOOLEAN V_CHAR CHAR(1) ; SELECT INTO FROM X V_CHAR DEPT WHERE DEPTNO = P_DNO ; RETURN ( TRUE ) ; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN ( FALSE ) ; END EMP_CNT ; 생성된함수를 SQL*Plus(iSQL*Plus) 에서실행 확인하는스크립트의내용. ( 별도로저장한다. 예를들면,p0508_run.sql ) SET SERVEROUTPUT ON IF VALID_DNO(50) THEN DBMS_OUTPUT.PUT_LINE( 존재하는부서 ) ; ELSE DBMS_OUTPUT.PUT_LINE( 존재하지않는부서 ) ; END IF ; END ; Written by AngelaLEE 5-13 www.muhanedu.net