【发布时间】:2011-04-16 23:32:44
【问题描述】:
我第一次体验了 Oracle 和 TOAD(我知道 SSMS)。我在更新过程中的输入参数旁边遇到了这个“%Type”,我不知道它是什么或它的含义。我在 Google 上找到了与“%Rowtype”相关的链接。是相同的东西还是完全不同的东西?
如果这含糊不清,我深表歉意。一如既往,感谢您的帮助。
【问题讨论】:
我第一次体验了 Oracle 和 TOAD(我知道 SSMS)。我在更新过程中的输入参数旁边遇到了这个“%Type”,我不知道它是什么或它的含义。我在 Google 上找到了与“%Rowtype”相关的链接。是相同的东西还是完全不同的东西?
如果这含糊不清,我深表歉意。一如既往,感谢您的帮助。
【问题讨论】:
Oracle(和PostgreSQL)有:
%TYPE 用于声明与现有表中列的数据类型相关的变量:
DECLARE v_id ORDERS.ORDER_ID%TYPE
这里的好处是,如果数据类型发生变化,变量数据类型会保持同步。
参考:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i6080
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;
/
【讨论】:
除了 OMG Ponies 指出的用途之外,%TYPE 还用于继承先前声明的变量所使用的相同数据类型。
语法是:
DECLARE
L_num NUMBER(5,2) NOT NULL default 3.21;
L_num_Test L_num%TYPE := 1.123;
所以不需要声明第二个变量的数据类型,即L_num_Test。
如果有人需要关于此主题的进一步说明,请发表评论。
参考:https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#BEIIGBBF
【讨论】:
一些例子
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;
/
【讨论】: