Organisation gespeicherter PL/SQL Objekte Data Dictionary General information Testen von Unterprogrammen Source code Editor Parameters Compile errors p-code Debug information SQL> describe ... DBMS_OUTPUT Copyright © Oracle Corporation, 1998. All rights reserved. USER_OBJECTS 8-2 * Spalte Spaltenbeschreibung OBJECT_NAME Name des Objekts OBJECT_ID Interner identifier des Objekts OBJECT_TYPE Typ des Objekts, z. B. TABLE, PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY CREATED Datum der Erstellung LAST_DDL_TIME Datum der letzten Änderung TIMESTAMP Datum und Zeit der letzten Recompilierung STATUS VALID or INVALID 8-3 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Liste aller Procedures und Functions SQL>SELECT 2 FROM 3 WHERE 4 ORDER BY 5 / object_name, object_type user_objects object_type in ('PROCEDURE', 'FUNCTION') object_name OBJECT_NAME ----------------ADD_DEPT ADD_ONE FIRE_EMP GET_SAL HIRE_EMP LOG_EXECUTION PROCESS_EMP QUERY_EMP REMOVE_AND_PROCESS_EMP REMOVE_DEPT 8-4 OBJECT_TYPE --------------------PROCEDURE PROCEDURE PROCEDURE FUNCTION PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. USER_SOURCE Spalte Spaltenbeschreibung NAME Name des Objekts TYPE Typ des Objekts, z. B. PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY LINE Zeilennummer im Quellcode TEXT Textzeile des Quellcodes Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. 8-5 Liste von Übersetzungsfehlern mit SHOW ERRORS SQL>SHOW ERRORS PROCEDURE log_execution Errors for PROCEDURE LOG_EXECUTION: LINE/COL ------3/7 ERROR ------------------------------------PLS-00103: Encountered the symbol “INTO” when expecting one of the following: ;= . ( @ % ; Replacing “INTO” with “:=“. 4/1 PLS-00203: Encountered the symbol “VALUES” when expecting one of the following: . ( * % & = - + ; < / > in mod not rem an exponent (**) <> or != or ~= >= <= <> and or like between etc. Replacing “VALUES” with “(“. 4/23 PLS-100103: Encountered the symbol “;” when expecting one of the following: ) , * & ⎮ = − + < / > in mod not rem => .. an exponent (**) <> or != ~= >= <= <> and or like between etc. ) was inserted before “;” to continue. 8-7 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Code von Prozeduren und Funktionen SQL> 2 3 4 SELECT FROM WHERE ORDER BY text user_source name = 'QUERY_EMP' line; TEXT -------------------------------------------------PROCEDURE QUERY_EMP (v_empno IN emp.empno%TYPE, v_name_job OUT VARCHAR2, v_salary OUT emp.sal%TYPE, v_commission OUT emp.comm%TYPE) IS BEGIN SELECT ename ||',' ||job, sal, comm INTO v_name_job, v_salary, v_commission FROM EMP WHERE empno = v_empno; END query_emp; 8-6 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Beschreibung von PL/SQL Objekten in SQL*Plus SQL>DESCRIBE HIRE_EMP PROCEDURE HIRE_EMP Argument Name Type In/Out ------------------------- ------V_ENAME VARCHAR2(25) IN V_MANAGER_ID NUMBER(7) IN V_TITLE VARCHAR2(25) IN V_SALARY NUMBER(11,2) IN V_COMMISSION NUMBER(4,2) IN SQL>DESCRIBE ADD_DEPT PROCEDURE ADD_DEPT Argument Name Type ------------------------V_NAME VARCHAR2(25) V_REGION_ID NUMBER(7) 8-8 Default? -------- In/Out Default? ------ -------IN DEFAULT IN DEFAULT Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Beschreibung von PL/SQL Objekten in SQL*Plus SQL>DESCRIBE GET_SAL FUNCTION GET_SAL RETURNS NUMBER Argument Name Type In/Out -------- ------------ ---V_ID NUMBER(7) IN Abhängigkeiten abhängige Objekte referenzierte Objekte Table Default? -------- View View Procedure Sequence Function Synonym Package Specification Procedure Package Body Function Database Trigger Package Specification Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. 8-9 8-10 Direkte Abhängigkeit Procedure Indirekte Abhängigkeit Table Procedure xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv Abhängiges Objekt 8-11 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. View/Procedure Table xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv xxxxxxxxxxxxxx vvvvvvvvvvvvvv Referenziertes Objekt Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Abhängiges Objekt 8-12 Abhängiges Referenziertes Referenziertes Objekt Objekt Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Gebrauch von DBMS_OUTPUT 1. SERVEROUTPUT einschalten Überprüfen einer Stored Procedure mit DBMS_OUTPUT SQL> SET SERVEROUTPUT ON 2. Text in den Puffer bringen SQL> EXECUTE DBMS_OUTPUT.PUT ('testing 1 2 3') PL/SQL procedure successfully completed. 3. Pufferinhalt anschauen SQL> EXECUTE DBMS_OUTPUT.NEW_LINE testing 1 2 3 PL/SQL procedure successfully completed. oder SQL> EXECUTE DBMS_OUTPUT.PUT_LINE ('testing 1 2 3 testing 4 5 6') testing 1 2 3 testing 4 5 6 PL/SQL procedure successfully completed. 8-13 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Kontrollausgaben Beispiel für Ausgaben der vorigen Prozedur SQL> SET SERVEROUTPUT ON SQL> EXECUTE remove_and_process_emp (22) no of employees in dept 44 is 2 as there is more than 1 person left in the dept, fire_emp only, will be fired. PL/SQL procedure successfully completed. 8-15 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. CREATE OR REPLACE PROCEDURE remove_and_process_emp (v_id IN s_emp.id%TYPE) IS v_no_of_employees NUMBER; v_dept__id s_emp.dept_id%TYPE; BEGIN ....../* SELECT statement to count the number of employees */ ...... dbms_output.put_line('no of employees in dept '⎮⎮ v_dept_id ⎮⎮ ' is ' ⎮⎮ v_no_of_employees); IF v_no_of_employees = 1 THEN dbms_output.put_line('As there is only 1 person left in the dept.'); dbms_output.put_line('fire_emp then remove department'); fire_emp (v_id); remove_dept (v_dept_id); ELSE dbms_output.put_line('As there is more than 1 person left in the dept, '); dbms_output.put_line('fire_emp only, will be fired'); fire_emp (v_id); END IF; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20200, 'Employee does not exist.'); END remove_and_process_emp; 8-14 Basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved.