【问题标题】:What does "%Type" mean in Oracle sql?Oracle sql中的“%Type”是什么意思?
【发布时间】:2011-04-16 23:32:44
【问题描述】:

我第一次体验了 Oracle 和 TOAD(我知道 SSMS)。我在更新过程中的输入参数旁边遇到了这个“%Type”,我不知道它是什么或它的含义。我在 Google 上找到了与“%Rowtype”相关的链接。是相同的东西还是完全不同的东西?

如果这含糊不清,我深表歉意。一如既往,感谢您的帮助。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    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

    This is used in cursors to declare a single variable to contain a single record from the resultset of a cursor or table without needing to specify individual variables(及其数据类型)。例如:

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

    【讨论】:

    • %rowtype 也可以用于表,如 declare v_emp emp%rowtype; begin select * into v_emp from emp where rownum=1;结束;
    【解决方案2】:

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

    【讨论】:

      【解决方案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;
      /
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 2021-11-10
        • 2020-04-30
        相关资源
        最近更新 更多