Oracle sql中的"%Type"是什么意思?

39

我正在接触Oracle和TOAD(我知道SSMS)。在更新存储过程的输入参数旁边,我发现了"%Type",但我不知道它是什么或者它的意思是什么。我在谷歌上找到了与"%Rowtype"相关的链接。这两者是相同的东西还是完全不同的东西?

如果我的描述含糊不清,我很抱歉。感谢您的帮助。

4个回答

61

Oracle(以及PostgreSQL)提供了以下内容:

  • %TYPE
  • %ROWTYPE

%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;
/

3
%rowtype也可用于表中,例如:declare v_emp emp%rowtype; begin select * into v_emp from emp where rownum=1; end; - Erich Kitzmueller

1
除了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

0

%Type及其用途:

  1. %Type数据类型用于为指定表的列名数据类型定义变量。
  2. 让我们以客户表为例,其中Customer_name数据类型为varchar2(30)。如果您使用%type,则指定的列或变量将采用varchar2(30)数据类型。
  3. 如何定义? vCustomerName Customer.Customer_Name%TYPE; 在上述定义语句中,Customer_Name的数据类型将被分配给名为vCustomerName的变量。 现实生活中的例子:如果您想创建一个简单的PL SQL块来检查从直接表分配数据类型的情况。PL SQL块:

-2

一些例子

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;
/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接