Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 46 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
46
Dung lượng
200,26 KB
Nội dung
Object Types 13-92 PL/SQL User's Guide and Reference CREATE TYPE Stack AS OBJECT ( top INTEGER, MEMBER FUNCTION full RETURN BOOLEAN, MEMBER PROCEDURE push (n IN INTEGER), ); CREATE TYPE BODY Stack AS MEMBER PROCEDURE push (n IN INTEGER) IS BEGIN IF NOT full THEN top := top + 1; END push; END; The following example shows that you can nest object types: CREATE TYPE Address AS OBJECT ( street_address VARCHAR2(35), city VARCHAR2(15), state CHAR(2), zip_code INTEGER ); CREATE TYPE Person AS OBJECT ( first_name VARCHAR2(15), last_name VARCHAR2(15), birthday DATE, home_address Address, nested object type phone_number VARCHAR2(15), ss_number INTEGER, ); Related Topics Functions, Packages, Procedures OPEN Statement PL/SQL Language Elements 13-93 OPEN Statement The OPEN statement executes the query associated with a cursor. It allocates database resources to process the query and identifies the result set the rows that match the query conditions. The cursor is positioned before the first row in the result set. For more information, see "Querying Data with PL/SQL" on page 6-9. Syntax Keyword and Parameter Description cursor_name An explicit cursor previously declared within the current scope and not currently open. cursor_parameter_name A variable declared as the formal parameter of a cursor. (For the syntax of cursor_parameter_declaration, see "Cursors" on page 13-38.) A cursor parameter can appear in a query wherever a constant can appear. Usage Notes Generally, PL/SQL parses an explicit cursor only the first time it is opened and parses a SQL statement (creating an implicit cursor) only the first time the statement is executed. All the parsed SQL statements are cached. A SQL statement is reparsed only if it is aged out of the cache by a new SQL statement. Although you must close a cursor before you can reopen it, PL/SQL need not reparse the associated SELECT statement. If you close, then immediately reopen the cursor, a reparse is definitely not needed. Rows in the result set are not retrieved when the OPEN statement is executed. The FETCH statement retrieves the rows. With a FOR UPDATE cursor, the rows are locked when the cursor is opened. If formal parameters are declared, actual parameters must be passed to the cursor. The formal parameters of a cursor must be IN parameters; they cannot return values to actual parameters. The values of actual parameters are used when the cursor is opened. The datatypes of the formal and actual parameters must be compatible. The query can also reference PL/SQL variables declared within its scope. Unless you want to accept default values, each formal parameter in the cursor declaration must have a corresponding actual parameter in the OPEN statement. Formal parameters declared with a default value do not need a corresponding actual parameter. They assume their default values when the OPEN statement is executed. You can associate the actual parameters in an OPEN statement with the formal parameters in a cursor declaration using positional or named notation. If a cursor is currently open, you cannot use its name in a cursor FOR loop. OPEN cursor_name ( cursor_parameter_name , ) ; open_statement OPEN Statement 13-94 PL/SQL User's Guide and Reference Examples Given the cursor declaration: CURSOR parts_cur IS SELECT part_num, part_price FROM parts; the following statement opens the cursor: OPEN parts_cur; Given the cursor declaration: CURSOR emp_cur(my_ename VARCHAR2, my_comm NUMBER DEFAULT 0) IS SELECT * FROM emp WHERE any of the following statements opens the cursor: OPEN emp_cur('LEE'); OPEN emp_cur('BLAKE', 300); OPEN emp_cur(employee_name, 150); Related Topics CLOSE Statement, Cursors, FETCH Statement, LOOP Statements OPEN-FOR Statement PL/SQL Language Elements 13-95 OPEN-FOR Statement The OPEN-FOR statement executes the query associated with a cursor variable. It allocates database resources to process the query and identifies the result set the rows that meet the query conditions. The cursor variable is positioned before the first row in the result set. For more information, see "Using Cursor Variables (REF CURSORs)" on page 6-19. Syntax Keyword and Parameter Description cursor_variable_name A cursor variable (or parameter) previously declared within the current scope. host_cursor_variable_name A cursor variable previously declared in a PL/SQL host environment and passed to PL/SQL as a bind variable. The datatype of the host cursor variable is compatible with the return type of any PL/SQL cursor variable. Host variables must be prefixed with a colon. select_statement A query associated with cursor_variable, which returns a set of values. The query can reference bind variables and PL/SQL variables, parameters, and functions. The syntax of select_statement is similar to the syntax for select_into_statement defined in "SELECT INTO Statement" on page 13-123, except that the cursor select_statement cannot have an INTO clause. Usage Notes You can declare a cursor variable in a PL/SQL host environment such as an OCI or Pro*C program. To open the host cursor variable, you can pass it as a bind variable to an anonymous PL/SQL block. You can reduce network traffic by grouping OPEN-FOR statements. For example, the following PL/SQL block opens five cursor variables in a single round-trip: /* anonymous PL/SQL block in host environment */ BEGIN OPEN :emp_cv FOR SELECT * FROM emp; OPEN :dept_cv FOR SELECT * FROM dept; OPEN :grade_cv FOR SELECT * FROM salgrade; OPEN :pay_cv FOR SELECT * FROM payroll; OPEN :ins_cv FOR SELECT * FROM insurance; END; Other OPEN-FOR statements can open the same cursor variable for different queries. You do not need to close a cursor variable before reopening it. When you reopen a cursor variable for a different query, the previous query is lost. OPEN cursor_variable_name : host_cursor_variable_name FOR select_statement ; open_for_statement OPEN-FOR Statement 13-96 PL/SQL User's Guide and Reference Unlike cursors, cursor variables do not take parameters. Instead, you can pass whole queries (not just parameters) to a cursor variable. Although a PL/SQL stored procedure or function can open a cursor variable and pass it back to a calling subprogram, the calling and called subprograms must be in the same instance. You cannot pass or return cursor variables to procedures and functions called through database links. When you declare a cursor variable as the formal parameter of a subprogram that opens the cursor variable, you must specify the IN OUT mode. That way, the subprogram can pass an open cursor back to the caller. Examples To centralize data retrieval, you can group type-compatible queries in a stored procedure. When called, the following packaged procedure opens the cursor variable emp_cv for the chosen query: CREATE PACKAGE emp_data AS TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE; PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp, choice IN INT); END emp_data; CREATE PACKAGE BODY emp_data AS PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp, choice IN INT) IS BEGIN IF choice = 1 THEN OPEN emp_cv FOR SELECT * FROM emp WHERE comm IS NOT NULL; ELSIF choice = 2 THEN OPEN emp_cv FOR SELECT * FROM emp WHERE sal > 2500; ELSIF choice = 3 THEN OPEN emp_cv FOR SELECT * FROM emp WHERE deptno = 20; END IF; END; END emp_data; For more flexibility, you can pass a cursor variable and a selector to a stored procedure that executes queries with different return types: CREATE PACKAGE admin_data AS TYPE GenCurTyp IS REF CURSOR; PROCEDURE open_cv (generic_cv IN OUT GenCurTyp, choice INT); END admin_data; CREATE PACKAGE BODY admin_data AS PROCEDURE open_cv (generic_cv IN OUT GenCurTyp, choice INT) IS BEGIN IF choice = 1 THEN OPEN generic_cv FOR SELECT * FROM emp; ELSIF choice = 2 THEN OPEN generic_cv FOR SELECT * FROM dept; ELSIF choice = 3 THEN OPEN generic_cv FOR SELECT * FROM salgrade; END IF; END; END admin_data; Related Topics CLOSE Statement, Cursor Variables, FETCH Statement, LOOP Statements OPEN-FOR-USING Statement PL/SQL Language Elements 13-97 OPEN-FOR-USING Statement The OPEN-FOR-USING statement associates a cursor variable with a query, executes the query, identifies the result set, positions the cursor before the first row in the result set, then zeroes the rows-processed count kept by %ROWCOUNT. For more information, see "Building a Dynamic Query with Dynamic SQL" on page 7-4. Because this statement can use bind variables to make the SQL processing more efficient, use the OPEN-FOR-USING statement when building a query where you know the WHERE clauses in advance. Use the OPEN-FOR statement when you need the flexibility to process a dynamic query with an unknown number of WHERE clauses. Syntax Keyword and Parameter Description cursor_variable_name A weakly typed cursor variable (one without a return type) previously declared within the current scope. bind_argument An expression whose value is passed to the dynamic SELECT statement. dynamic_string A string literal, variable, or expression that represents a multi-row SELECT statement. host_cursor_variable_name A cursor variable declared in a PL/SQL host environment and passed to PL/SQL as a bind variable. The datatype of the host cursor variable is compatible with the return type of any PL/SQL cursor variable. Host variables must be prefixed with a colon. USING This optional clause specifies a list of bind arguments. At run time, bind arguments in the USING clause replace corresponding placeholders in the dynamic SELECT statement. Usage Notes You use three statements to process a dynamic multi-row query: OPEN-FOR-USING, FETCH, and CLOSE. First, you OPEN a cursor variable FOR a multi-row query. Then, you FETCH rows from the result set. When all the rows are processed, you CLOSE the cursor variable. OPEN cursor_variable_name : host_cursor_variable_name FOR dynamic_string open_for_using_statement USING bind_argument , ; OPEN-FOR-USING Statement 13-98 PL/SQL User's Guide and Reference The dynamic string can contain any multi-row SELECT statement (without the terminator). The string can also contain placeholders for bind arguments. However, you cannot use bind arguments to pass the names of schema objects to a dynamic SQL statement. Every placeholder in the dynamic string must be associated with a bind argument in the USING clause. Numeric, character, and string literals are allowed in the USING clause, but Boolean literals (TRUE, FALSE, NULL) are not. To pass nulls to the dynamic string, you must use a workaround. See "Passing Nulls to Dynamic SQL" on page 7-10. Any bind arguments in the query are evaluated only when the cursor variable is opened. To fetch from the cursor using different bind values, you must reopen the cursor variable with the bind arguments set to their new values. Dynamic SQL supports all the SQL datatypes. For example, bind arguments can be collections, LOBs, instances of an object type, and refs. As a rule, dynamic SQL does not support PL/SQL-specific types. For instance, bind arguments cannot be Booleans or index-by tables. Example The following example declares a cursor variable, then associates it with a dynamic SELECT statement: DECLARE TYPE EmpCurTyp IS REF CURSOR; define weak REF CURSOR type emp_cv EmpCurTyp; declare cursor variable my_ename VARCHAR2(15); my_sal NUMBER := 1000; BEGIN OPEN emp_cv FOR open cursor variable 'SELECT ename, sal FROM emp WHERE sal > :s' USING my_sal; END; Related Topics EXECUTE IMMEDIATE Statement, OPEN-FOR Statement Packages PL/SQL Language Elements 13-99 Packages A package is a schema object that groups logically related PL/SQL types, items, and subprograms. Use packages when writing a set of related subprograms that form an application programming interface (API) that you or others might reuse. Packages have two parts: a specification (spec for short) and a body. For more information, see Chapter 9, "Using PL/SQL Packages". Syntax CREATE OR REPLACE PACKAGE schema_name . package_name package_declaration | package_spec collection_type_definition record_type_definition subtype_definition collection_declaration constant_declaration exception_declaration object_declaration record_declaration variable_declaration cursor_spec function_spec procedure_spec call spec pragma_restrict_refs END package_name ; AUTHID CURRENT_USER DEFINER IS AS PRAGMA SERIALLY_REUSABLE ; Packages 13-100 PL/SQL User's Guide and Reference Keyword and Parameter Description AUTHID Determines whether all the packaged subprograms execute with the privileges of their definer (the default) or invoker, and whether their unqualified references to schema objects are resolved in the schema of the definer or invoker. For more information, see "Using Invoker's Rights Versus Definer's Rights (AUTHID Clause)" on page 8-15. call_spec Publishes a Java method or external C function in the Oracle data dictionary. It publishes the routine by mapping its name, parameter types, and return type to their SQL counterparts. For more information, see Oracle Database Java Developer's Guide and Oracle Database Application Developer's Guide - Fundamentals. collection_declaration Declares a collection (nested table, index-by table, or varray). For the syntax of collection_declaration, see "Collections" on page 13-21. collection_type_definition Defines a collection type using the datatype specifier TABLE or VARRAY. CREATE OR REPLACE PACKAGE BODY schema_name . package_name package_body collection_type_definition record_type_definition subtype_definition collection_declaration constant_declaration exception_declaration object_declaration record_declaration variable_declaration cursor_body function_body procedure_body call spec BEGIN statement END package_name ; IS AS PRAGMA SERIALLY_REUSABLE ; Packages PL/SQL Language Elements 13-101 constant_declaration Declares a constant. For the syntax of constant_declaration, see "Constants and Variables" on page 13-28. cursor_body Defines the underlying implementation of an explicit cursor. For the syntax of cursor_body, see "Cursors" on page 13-38. cursor_spec Declares the interface to an explicit cursor. For the syntax of cursor_spec, see "Cursors" on page 13-38. exception_declaration Declares an exception. For the syntax of exception_declaration, see "Exceptions" on page 13-45. function_body Implements a function. For the syntax of function_body, see "Functions" on page 13-67. function_spec Declares the interface to a function. For the syntax of function_spec, see "Functions" on page 13-67. object_declaration Declares an object (instance of an object type). For the syntax of object_declaration, see "Object Types" on page 13-86. package_name A package stored in the database. For naming conventions, see "Identifiers" on page 2-3. pragma_restrict_refs Pragma RESTRICT_REFERENCES, which checks for violations of "purity" rules. To be callable from SQL statements, a function must obey rules that control side effects. If any SQL statement inside the function body violates a rule, you get an error at run time (when the statement is parsed). For the syntax of the pragma, see "RESTRICT_REFERENCES Pragma" on page 13-113. The pragma asserts that a function does not read and/or write database tables and/or package variables. For more information about the purity rules and pragma RESTRICT_REFERENCES, see Oracle Database Application Developer's Guide - Fundamentals. PRAGMA SERIALLY_REUSABLE Marks a package as serially reusable, if its state is needed only for the duration of one call to the server (for example, an OCI call to the server or a server-to-server remote procedure call). For more information, see Oracle Database Application Developer's Guide - Fundamentals. [...]... PL/SQL User's Guide and Reference Packages Cursors and subprograms declared in a package spec must be defined in the package body Other program items declared in the package spec cannot be redeclared in the package body To match subprogram specs and bodies, PL/SQL does a token-by-token comparison of their headers Except for white space, the headers must match word for word Otherwise, PL/SQL raises an... cursors, constants, variables, exceptions, and subprograms These items are local and cease to exist when you exit the procedure The executable part contains statements that assign values, control execution, and manipulate Oracle data The exception-handling part contains handlers that deal with exceptions raised during execution For more information, see "Understanding PL/SQL Procedures" on page 8-3 Syntax... the scope of that exception When an exception is raised, if PL/SQL cannot find a handler for it in the current block, the exception propagates to successive enclosing blocks, until a handler is found or there are no more blocks to search If no handler is found, PL/SQL returns an unhandled exception error to the host environment In an exception handler, you can omit the exception name in a RAISE statement,... department_id = 20; END; / Related Topics Collections, Functions, Packages, Procedures 13-112 PL/SQL User's Guide and Reference RESTRICT_REFERENCES Pragma RESTRICT_REFERENCES Pragma To be callable from SQL statements, a stored function must obey certain "purity" rules, which control side-effects (See "Controlling Side Effects of PL/SQL Subprograms" on page 8-22.) The fewer side-effects a function has, the better... Procedures 13-116 PL/SQL User's Guide and Reference ROLLBACK Statement ROLLBACK Statement The ROLLBACK statement is the inverse of the COMMIT statement It undoes some or all database changes made during the current transaction For more information, see "Overview of Transaction Processing in PL/SQL" on page 6- 29 Syntax rollback_statement SAVEPOINT WORK TO savepoint_name ROLLBACK ; Keyword and Parameter... FROM employees WHERE employee_id = my_empno; IF (emp_rec.department_id = 20) AND (emp_rec.salary > 2000) THEN NULL; END IF; END; / Related Topics Constants and Variables, Cursors, Cursor Variables, FETCH Statement 13-120 PL/SQL User's Guide and Reference SAVEPOINT Statement SAVEPOINT Statement The SAVEPOINT statement names and marks the current point in the processing of a transaction With the ROLLBACK... raise ZERO_DIVIDE; END IF; 13-108 PL/SQL User's Guide and Reference RAISE Statement EXCEPTION WHEN out_of_stock THEN dbms_output.put_line('No more parts in stock.'); WHEN ZERO_DIVIDE THEN dbms_output.put_line('Attempt to divide by zero.'); WHEN OTHERS THEN dbms_output.put_line('Some other kind of problem '); END; / Related Topics Exceptions PL/SQL Language Elements 13-1 09 Records Records Records are composite... parameter_declaration ) DEFINER IS AS 13-104 PL/SQL User's Guide and Reference Procedures PRAGMA AUTONOMOUS_TRANSACTION ; type_definition function_declaration item_declaration procedure_declaration BEGIN EXCEPTION exception_handler procedure_name END parameter_declaration statement ; IN OUT NOCOPY IN OUT parameter_name datatype := expression DEFAULT Keyword and Parameter Description AUTHID Determines... variable For summary information about the parameter modes, see Table 8–1 on page 8-8 13-106 PL/SQL User's Guide and Reference Procedures Unlike OUT and IN OUT parameters, IN parameters can be initialized to default values For more information, see "Using Default Values for Subprogram Parameters" on page 8 -9 Before exiting a procedure, explicitly assign values to all OUT formal parameters An OUT actual... back an in-doubt distributed transaction PL/SQL does not support this clause For example, the following statement is not allowed: ROLLBACK WORK FORCE '24.37.85'; not allowed PL/SQL Language Elements 13-117 ROLLBACK Statement In embedded SQL, the RELEASE option frees all Oracle resources (locks and cursors) held by a program and disconnects from the database PL/SQL does not support this option For . Statement 13-108 PL/SQL User's Guide and Reference RAISE Statement The RAISE statement stops normal execution of a PL/SQL block or subprogram and transfers control to an exception handler. RAISE. Statement 13 -96 PL/SQL User's Guide and Reference Unlike cursors, cursor variables do not take parameters. Instead, you can pass whole queries (not just parameters) to a cursor variable. Although a PL/SQL. Object Types 13 -92 PL/SQL User's Guide and Reference CREATE TYPE Stack AS OBJECT ( top INTEGER, MEMBER FUNCTION full RETURN