Что означает "% Тип" в Oracle sql?
Я получаю свой первый опыт работы с Oracle и TOAD (я знаю SSMS). Я столкнулся с этим "% Type" рядом с параметром ввода в процедуре обновления, и я понятия не имею, что это такое или что это значит. Я нашел ссылки на Google, связанные с "% Rowtype". То же самое или что-то совсем другое?
Если это расплывчато, я извиняюсь. Как всегда, спасибо за помощь.
Ответы
Ответ 1
Oracle (и PostgreSQL) имеют:
% TYPE
%TYPE
используется для объявления переменных по отношению к типу данных столбца в существующей таблице:
DECLARE v_id ORDERS.ORDER_ID%TYPE
Преимущество здесь в том, что если тип данных изменяется, переменный тип данных остается в синхронизации.
Ссылка: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i6080
% ROWTYPE
Это используется в курсорах для объявления одной переменной, содержащей одну запись из набора результатов курсора или таблицы, без необходимости указывать отдельные переменные (и их типы данных). Пример:
DECLARE
CURSOR c1 IS
SELECT last_name, salary, hire_date, job_id
FROM employees
WHERE employee_id = 120;
-- declare record variable that represents a row fetched from the employees table
employee_rec c1%ROWTYPE;
BEGIN
-- open the explicit cursor and use it to fetch data into employee_rec
OPEN c1;
FETCH c1 INTO employee_rec;
DBMS_OUTPUT.PUT_LINE('Employee name: ' || employee_rec.last_name);
END;
/
Ответ 2
%Type
используется для наследования того же типа данных, который использовался предыдущей объявленной переменной.
Синтаксис:
Declare
L_num Number(5,2) not null default 3.21;
L_num_Test L_num%Type:=1.123;
Поэтому нет необходимости объявлять тип данных для второй переменной i.e L_num_Test
.
Комментировать, если кому-то нужно уточнить эту тему.
Ответ 3
некоторый пример
set serveroutput on
DECLARE
var1 table_a.id%TYPE;
var2 table_a.value%TYPE;
var3_row table_a%ROWTYPE;
BEGIN
SELECT id,value
INTO var1, var2
FROM table_a
WHERE id= 8 AND ROWNUM<=1;
SELECT id+100,value INTO var3_row from table_A where rownum=1;
INSERT INTO table_a VALUES var3_row;
dbms_output.put_line('this is a test');
dbms_output.put_line(var1);
dbms_output.put_line(var2);
NULL; -- do something useful here
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL; -- do something appropriate here
WHEN TOO_MANY_ROWS THEN
NULL; -- do something appropriate here
END;
/