Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
37
Добавлен:
16.04.2013
Размер:
5.97 Mб
Скачать

%TYPE Attribute

%TYPE Attribute

The %TYPE attribute lets use the datatype of a field, record, nested table, database column, or variable in your own declarations, instead of hardcoding the type names. You can use the %TYPE attribute as a datatype specifier when declaring constants, variables, fields, and parameters. If the types that you reference change, your declarations are automatically updated. This technique saves you from making code changes when, for example, the length of a VARCHAR2 column is increased. For more information, see "Using the %TYPE Attribute" on page 2-9.

Syntax

type_attribute

collection_name cursor_variable_name object_name

.

field_name

%

TYPE

 

 

record_name

db_table_name . column_name variable_name

Keyword and Parameter Description

collection_name

A nested table, index-by table, or varray previously declared within the current scope.

cursor_variable_name

A PL/SQL cursor variable previously declared within the current scope. Only the value of another cursor variable can be assigned to a cursor variable.

db_table_name.column_name

A table and column that must be accessible when the declaration is elaborated.

object_name

An instance of an object type, previously declared within the current scope.

record_name

A user-defined or %ROWTYPE record, previously declared within the current scope.

record_name.field_name

A field in a user-defined or %ROWTYPE record, previously declared within the current scope.

variable_name

A variable, previously declared in the same scope.

PL/SQL Language Elements 13-139

%TYPE Attribute

Usage Notes

The %TYPE attribute is particularly useful when declaring variables, fields, and parameters that refer to database columns. Your code can keep working even when the lengths or types of the columns change.

The NOT NULL column constraint is not inherited by items declared using %TYPE.

Examples

DECLARE

--We know that BUFFER2 and BUFFER3 will be big enough to hold

--the answers. If we have to increase the size of BUFFER1, the

--other variables will change size as well. buffer1 VARCHAR2(13) := 'abCdefGhiJklm'; buffer2 buffer1%TYPE := UPPER(buffer1); buffer3 buffer1%TYPE := LOWER(buffer1);

--We know that this variable will be able to hold the contents

--of this table column. If the table is altered to make the

--column longer or shorter, this variable will change size as well. tname user_tables.table_name%TYPE;

--%TYPE is great for subprogram parameters too, no need to

--recompile the subprogram if the table column changes.

PROCEDURE print_table_name(the_name user_tables.table_name%TYPE) IS

BEGIN

dbms_output.put_line('Table = ' || the_name); END;

BEGIN

SELECT table_name INTO tname FROM user_tables WHERE ROWNUM < 2; print_table_name(tname);

END;

/

Constants and Variables, %ROWTYPE Attribute

13-140 PL/SQL User's Guide and Reference

UPDATE Statement

UPDATE Statement

The UPDATE statement changes the values of specified columns in one or more rows in a table or view. For a full description of the UPDATE statement, see Oracle Database SQL Reference.

Syntax

update_statement

table_reference

alias

UPDATE

(

subquery

)

TABLE ( subquery2 )

 

 

 

 

,

 

 

 

 

 

 

sql_expression

 

 

column_name

=

 

 

 

 

 

 

 

 

(

subquery3

)

 

SET

 

,

 

 

 

 

 

 

 

 

 

 

 

 

(

column_name

)

=

(

subquery4

)

 

search_condition

 

 

 

 

 

WHERE

 

 

 

 

 

 

 

 

CURRENT OF

cursor_name

 

returning_clause

;

Keyword and Parameter Description

alias

Another (usually short) name for the referenced table or view, typically used in the WHERE clause.

column_name

The column (or one of the columns) to be updated. It must be the name of a column in the referenced table or view. A column name cannot be repeated in the column_name list. Column names need not appear in the UPDATE statement in the same order that they appear in the table or view.

returning_clause

Returns values from updated rows, eliminating the need to SELECT the rows afterward. You can retrieve the column values into variables or host variables, or into collections or host arrays. You cannot use the RETURNING clause for remote or parallel updates. If the statement does not affect any rows, the values of the variables specified in the RETURNING clause are undefined. For the syntax of returning_clause, see "DELETE Statement" on page 13-41.

SET column_name = sql_expression

This clause assigns the value of sql_expression to the column identified by column_name. If sql_expression contains references to columns in the table being

PL/SQL Language Elements 13-141

UPDATE Statement

updated, the references are resolved in the context of the current row. The old column values are used on the right side of the equal sign.

SET column_name = (subquery3)

Assigns the value retrieved from the database by subquery3 to the column identified by column_name. The subquery must return exactly one row and one column.

SET (column_name, column_name, ...) = (subquery4)

Assigns the values retrieved from the database by subquery4 to the columns in the column_name list. The subquery must return exactly one row that includes all the columns listed.

The column values returned by the subquery are assigned to the columns in the column list in order. The first value is assigned to the first column in the list, the second value is assigned to the second column in the list, and so on.

The following example creates a table with correct employee IDs but garbled names. Then it runs an UPDATE statement with a correlated query, to retrieve the correct names from the EMPLOYEES table and fix the names in the new table.

-- Create a table with all the right IDs, but messed-up names. CREATE TABLE e1 AS

SELECT employee_id, UPPER(first_name) first_name,

TRANSLATE(last_name,'aeiou','12345') last_name FROM employees;

BEGIN

--Display the first 5 names to show they're messed up. FOR person IN (SELECT * FROM e1 WHERE ROWNUM < 6) LOOP

dbms_output.put_line(person.first_name || ' ' || person.last_name); END LOOP;

UPDATE e1 SET (first_name, last_name) = (SELECT first_name, last_name FROM employees

WHERE employee_id = e1.employee_id);

dbms_output.put_line('*** Updated ' || SQL%ROWCOUNT || ' rows. ***');

--Display the first 5 names to show they've been fixed up. FOR person IN (SELECT * FROM e1 WHERE ROWNUM < 6)

LOOP

dbms_output.put_line(person.first_name || ' ' || person.last_name); END LOOP;

END;

/

DROP TABLE e1;

sql_expression

Any valid SQL expression. For more information, see Oracle Database SQL Reference.

subquery

A SELECT statement that provides a set of rows for processing. Its syntax is like that of select_into_statement without the INTO clause. See "SELECT INTO Statement" on page 13-123.

13-142 PL/SQL User's Guide and Reference

UPDATE Statement

table_reference

A table or view that must be accessible when you execute the UPDATE statement, and for which you must have UPDATE privileges. For the syntax of table_reference, see "DELETE Statement" on page 13-41.

TABLE (subquery2)

The operand of TABLE is a SELECT statement that returns a single column value, which must be a nested table or a varray. Operator TABLE informs Oracle that the value is a collection, not a scalar value.

WHERE CURRENT OF cursor_name

Refers to the latest row processed by the FETCH statement associated with the specified cursor. The cursor must be FOR UPDATE and must be open and positioned on a row.

If the cursor is not open, the CURRENT OF clause causes an error. If the cursor is open, but no rows have been fetched or the last fetch returned no rows, PL/SQL raises the predefined exception NO_DATA_FOUND.

WHERE search_condition

Chooses which rows to update in the database table. Only rows that meet the search condition are updated. If you omit this clause, all rows in the table are updated.

Usage Notes

You can use the UPDATE WHERE CURRENT OF statement after a fetch from an open cursor (including fetches done by a cursor FOR loop), provided the associated query is FOR UPDATE. This statement updates the row that was just fetched.

The implicit cursor SQL and the cursor attributes %NOTFOUND, %FOUND, %ROWCOUNT, and %ISOPEN let you access useful information about the execution of an UPDATE statement.

Examples

The following example demonstrates how to update table rows based on conditions, and how to store the updated values, columns, or entire rows in PL/SQL variables:

--Create some rows with values in all caps like (EMPLOYEES,TABLE)

--and (EMP_JOB_IX,INDEX).

CREATE TABLE my_objects AS SELECT object_name, object_type FROM user_objects;

DECLARE

my_name my_objects.object_name%TYPE; my_type my_objects.object_type%TYPE;

TYPE name_typ IS TABLE OF my_objects.object_name%TYPE INDEX BY PLS_INTEGER; TYPE type_typ IS TABLE OF my_objects.object_type%TYPE INDEX BY PLS_INTEGER; all_names name_typ;

all_types type_typ;

TYPE table_typ IS TABLE OF my_objects%ROWTYPE INDEX BY PLS_INTEGER; all_rows table_typ;

BEGIN

--Show the first 10 rows as they originally were.

FOR obj IN (SELECT * FROM my_objects WHERE ROWNUM < 11) LOOP

dbms_output.put_line('Name = ' || obj.object_name || ', type = ' || obj.object_type);

END LOOP;

PL/SQL Language Elements 13-143

UPDATE Statement

UPDATE my_objects SET object_name = LOWER(object_name) WHERE object_type = 'TABLE';

dbms_output.put_line('*** Updated ' || SQL%ROWCOUNT || ' rows. ***');

--Show the first 10 rows after the update.

--Only some of the names (the table names) have been changed to lowercase. FOR obj IN (SELECT * FROM my_objects WHERE ROWNUM < 11)

LOOP

dbms_output.put_line('Name = ' || obj.object_name || ', type = ' || obj.object_type);

END LOOP;

--Update a single row, and store the values of updated (or unchanged)

--columns in variables.

UPDATE my_objects SET object_name = INITCAP(object_name) WHERE object_name = 'employees'

RETURNING object_name, object_type INTO my_name, my_type;

dbms_output.put_line('*** Updated ' || SQL%ROWCOUNT || ' rows. ***');

dbms_output.put_line('Affected this row: ' || my_name || ', ' || my_type);

--Update many rows, storing the values of updated (or unchanged)

--columns in collections of records. Can't use 'RETURNING *', have

--to list the columns individually.

UPDATE my_objects SET object_name = INITCAP(object_name) WHERE object_type IN ('TRIGGER','VIEW','SEQUENCE')

RETURNING object_name, object_type BULK COLLECT INTO all_rows;

dbms_output.put_line('*** Updated ' || SQL%ROWCOUNT || ' rows. ***');

FOR i IN all_rows.FIRST .. all_rows.LAST LOOP

dbms_output.put_line('Affected this row: ' || all_rows(i).object_name || ',

'|| all_rows(i).object_type); END LOOP;

--Update many rows, storing the values of updated (or unchanged)

--columns in separate collections. (Generally less useful than using

--collections of records as above.)

UPDATE my_objects SET object_name = INITCAP(object_name) WHERE object_type IN ('INDEX','PROCEDURE')

RETURNING object_name, object_type BULK COLLECT INTO all_names, all_types;

dbms_output.put_line('*** Updated ' || SQL%ROWCOUNT || ' rows. ***');

FOR i IN all_names.FIRST .. all_names.LAST LOOP

dbms_output.put_line('Affected this row: ' || all_names(i) || ', ' || all_types(i));

END LOOP;

END;

/

DROP TABLE my_objects;

Related Topics

DELETE Statement, FETCH Statement, INSERT Statement

13-144 PL/SQL User's Guide and Reference

Соседние файлы в папке Oracle 10g