The document discusses PL/SQL cursors including implicit and explicit cursors. It describes how to declare, open, fetch from, and close an explicit cursor. It also shows an example using an explicit cursor to update customer credit limits. The document concludes with information on creating triggers in Oracle including the basic CREATE TRIGGER syntax and an example audit trigger.
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0 ratings0% found this document useful (0 votes)
27 views13 pages
PLSQL Cur
The document discusses PL/SQL cursors including implicit and explicit cursors. It describes how to declare, open, fetch from, and close an explicit cursor. It also shows an example using an explicit cursor to update customer credit limits. The document concludes with information on creating triggers in Oracle including the basic CREATE TRIGGER syntax and an example audit trigger.
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 13
PL/SQL Cursor
• A cursor is a pointer that points to a result of a query.
• PL/SQL has two types of cursors: • implicit cursors and • explicit cursors. Implicit cursors • Whenever Oracle executes an SQL statement such as SELECT INTO, INSERT, UPDATE, and DELETE, it automatically creates an implicit cursor. Explicit cursors • An explicit cursor is a SELECT statement declared explicitly in the declaration section of the current block or a package specification. The following illustration shows the execution cycle of an explicit cursor: Declare a cursor • Before using an explicit cursor, you must declare it in the declaration section of a block or package as follows: CURSOR cursor_name IS query; Open a cursor • Before start fetching rows from the cursor, you must open it. To open a cursor, you use the following syntax: OPEN cursor_name; Fetch from a cursor • The FETCH statement places the contents of the current row into variables. The syntax of FETCH statement is as follows: FETCH cursor_name INTO variable_list; Closing a cursor After fetching all rows, you need to close the cursor with the CLOSE statement: CLOSE cursor_name;
Explicit Cursor Attributes
A cursor has four attributes which you can reference in the following format: cursor_name%attribute Where cursor_name is the name of the explicit cursor. 1) %ISOPEN This attribute is TRUE if the cursor is open or FALSE if it is not. 2) %FOUND This attribute has four values: •NULL before the first fetch •TRUE if a record was fetched successfully •FALSE if no row is returned •INVALID_CURSOR if the cursor is not opened 3) %NOTFOUND This attribute has four values: •NULL before the first fetch •FALSE if a record was fetched successfully •TRUE if no row is returned •INVALID_CURSOR if the cursor is not opened 3) %ROWCOUNT The %ROWCOUNT attribute returns the number of rows fetched from the cursor. If the cursor is not opened, this attribute returns INVALID_CURSOR. CREATE VIEW sales AS SELECT customer_id, SUM(unit_price * quantity) total, ROUND(SUM(unit_price * quantity) * 0.05) credit FROM order_items INNER JOIN orders USING (order_id) WHERE status = 'Shipped' GROUP BY customer_id; DECLARE FETCH c_sales INTO r_sales; l_budget NUMBER := 1000000; EXIT WHEN c_sales -- reduce the budget for credit limit -- cursor %NOTFOUND; l_budget := l_budget - CURSOR c_sales IS r_sales.credit; SELECT * FROM sales -- update credit for the current customer ORDER BY total DESC; UPDATE -- record customers DBMS_OUTPUT.PUT_LINE( 'Custo SET mer id: ' ||r_sales.customer_id || r_sales c_sales%ROWTYPE; credit_limit = ' Credit: ' || r_sales.credit || ' BEGIN Remaining Budget: ' || l_budget ); CASE WHEN l_budget > r_sales.credit -- reset credit limit of all customers -- check the budget THEN r_sales.credit UPDATE customers SET EXIT WHEN l_budget <= 0; credit_limit = 0; ELSE l_budget END END LOOP;
OPEN c_sales; WHERE
customer_id = CLOSE c_sales; r_sales.customer_id; END; LOOP Creating a trigger in Oracle CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } triggering_event ON table_name [FOR EACH ROW] [FOLLOWS | PRECEDES another_trigger] [ENABLE / DISABLE ] [WHEN condition] DECLARE declaration statements BEGIN executable statements EXCEPTION exception_handling statements END; CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } triggering_event ON table_name [FOR EACH ROW] [FOLLOWS | PRECEDES another_trigger] [ENABLE / DISABLE ] [WHEN condition] DECLARE declaration statements BEGIN executable statements EXCEPTION exception_handling statements END; CREATE TABLE audits ( audit_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, table_name VARCHAR2(255), transaction_name VARCHAR2(10), by_user VARCHAR2(30), transaction_date DATE ); CREATE OR REPLACE TRIGGER customers_audit_trg AFTER UPDATE OR DELETE ON customers FOR EACH ROW DECLARE l_transaction VARCHAR2(10); BEGIN -- determine the transaction type l_transaction := CASE WHEN UPDATING THEN 'UPDATE' WHEN DELETING THEN 'DELETE' END;