23. Managing Code in the Database
Contents:
You will either embed PL/SQL programs in your client-side application, as happens in the Oracle Developer/2000 tools, or you will store your code in the Oracle database. The term stored procedure commonly refers to code that is stored in the database. Along with procedures, you can also store functions and packages, which can contain variables, cursors, record structures, etc. Whenever you hear the term stored procedures, you should think "stored objects." There are a number of benefits to storing an object in the database:
Stored objects play an important role in today's client-server applications. The information in this chapter will help you make the best possible use of stored objects. 23.1 Executing Stored CodeTo execute a stored program unit, you must first store this program in the database. I'll explain this CREATE OR REPLACE step later in this chapter. For now, let's take a look at what happens when you run a stored PL/SQL program. 23.1.1 Executing ProceduresIf you are working in SQL*Plus, you can execute programs directly from the command line. Use the EXECUTE command to run procedures as follows: SQL> execute calc_totals Notice that you do not have to provide a semicolon. In fact, if you are going to use the EXECUTE command, the entire PL/SQL procedure call must fit on one physical line. As soon as you press the Enter key, the program executes. You can also save a few microseconds (but accumulated over a whole year...) by providing only the minimum number of characters for the EXECUTE command: SQL> exec calc_totals When you are executing a procedure within a PL/SQL block, you do not use the EXECUTE syntax. You simply call the procedure, passing all necessary parameters within parentheses, and then terminate the line of code with a semicolon. Here is the syntax for calling the calc_totals procedure within a PL/SQL block: BEGIN calc_totals; END; You can also execute PL/SQL procedures in various "front-end" tools, such as Oracle Forms, PowerBuilder, and many 3GL languages like C and COBOL. The syntax for calling procedures (and functions) will vary from tool to tool. Within the Oracle Developer/2000 environment, you can call stored programs from within a "native," albeit outdated, version of PL/SQL (see Appendix B, Calling Stored Procedures from PL/SQL Version 1.1 , for more information). From a language like C, you will actually use a precompiler called Pro*C (from Oracle) and embed calls to PL/SQL programs within a SQL execution block like this: EXEC SQL EXECUTE BEGIN calc_totals; END; END-EXEC; 23.1.2 Executing FunctionsThe situation with functions is a little bit different. A function returns a value, so you can't just execute it directly. If you try to run a function as if it is a procedure, you will get the following error: SQL> exec total_sales (1997) begin total_sales (1997); end; * ERROR at line 1: ORA-06550: line 1, column 7: PLS-00221: 'TOTAL_SALES' is not a procedure or is undefined ORA-06550: line 1, column 7: PL/SQL: Statement ignored If you want to run a function simply to view its return value, you can execute it within a call to DBMS_OUTPUT. PUT_LINE as follows: SQL> exec DBMS_OUTPUT.PUT_LINE (total_sales (1997)) Of course, this only works if the datatype of the return value of the function matches one of the datatypes supported by DBMS_OUTPUT: number, string and date. For anything else, you will need to execute the function within an anonymous block and then convert the value as necessary for display. In the following example, I declare a PL/SQL table of strings to retrieve the value from a function that returns all the foreign key information for a table. I then use a FOR loop to display that information: /* Employs PL/SQL 2.3 syntax for PL/SQL tables. */ DECLARE TYPE strtabtype IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER; strtab strtabtype; BEGIN strtab := primary_keys.for_table (`emp'); IF strtab.COUNT > 0 THEN FOR tabrow IN strtab.FIRST .. strtab.LAST LOOP DBMS_OUTPUT.PUT_LINE (strtab.column_name); END LOOP; END IF; END; / If I have saved this block in a file called myscript.sql, I can then execute this program and verify my function's behavior as follows: SQL> @myscript
Now that you've seen how to execute programs "from the outside," let's move inside and take a look at the architecture Oracle employs to deliver that code to you for execution. 23.1.3 Memory-Based Architecture of PL/SQL CodeWhenever you start up an Oracle instance, a chunk (usually a rather large chunk) of memory is set aside for the System Global Area or SGA. Various Oracle processes manage this area of memory to do any of the following and more:
When you use a stored program element (by executing a procedure or function or by making reference to a nonexecutable part of a package like a constant or cursor), it must be accessible from the SGA. So when you reference a program element, its compiled version is loaded into the SGA's shared pool, if it is not already present. Then any program data associated with that element is instantiated in your Program Global Area (PGA). At that point, the code can be executed or otherwise used in your session. The next time a session with execute authority on that program element references it, it will already have been loaded and will therefore be available for execution. When the SGA shared pool area fills up, code in the pool will be aged out (that is, room will be made for newly requested programs) on a least-recently-used basis. Programs which are used often will therefore most likely be available immediately upon request. You can also pin programs into shared memory if you want to make certain that they will not be aged out. See Chapter 25, Tuning PL/SQL Applications , for more details on pinning. Note that even if your compiled code is aged out of the SGA, any persistent, package-based data will remain available in your PGA. In other words, code may be swapped out of the SGA, but program data remains and persists for the duration of your session (or until you explicitly request a reinitialization of your schema). Figure 23.1 illustrates a number of the points covered in this section. Figure 23.1: The System Global Area and Program Global Area23.1.4 Key Concepts for Program ExecutionHere are some basic principles to remember about program execution:
Copyright (c) 2000 O'Reilly & Associates. All rights reserved. |
|