oracle 中number 类型对应pgsql 中什么类型

解决方案 »

  1.   

    不一定,有可能带小数时是double,一般情况下是用double来对应
      

  2.   

    oracle 中number 类型对应pgsql 中什么类型
    对应的有什么实际的意义吗
      

  3.   

    -- 可以说对应 PLS_INTEGER ,但在PL/SQL中也可以定义number()类型的变量,
    -- 只是一般认为用PLS_INTEGER效率比number类型要高(计算速度快)
    -- 例如:DECLARE
      CURSOR cur_employee IS
        SELECT employee_id, salary, ROWID
        FROM   s_employee_test;
      lv_new_salary_num NUMBER;
      lv_count_num      PLS_INTEGER := 0;
      lv_start_time_num PLS_INTEGER;
    BEGIN
      lv_start_time_num := DBMS_UTILITY.GET_TIME;
      FOR cur_employee_rec IN cur_employee LOOP
        lv_count_num := lv_count_num + 1;
        -- Determination of salary increase
        lv_new_salary_num := cur_employee_rec.salary;
        UPDATE s_employee_test
        SET salary = lv_new_salary_num
        WHERE rowid = cur_employee_rec.ROWID;
        IF MOD(lv_count_num, 1000) = 0 THEN
          DBMS_APPLICATION_INFO.SET_MODULE('Records Processed: ' ||
            lv_count_num, 'Elapsed: ' || (DBMS_UTILITY.GET_TIME - lv_start_time_num)/100 || ' sec');
        END IF;
      END LOOP;
      COMMIT;
      DBMS_APPLICATION_INFO.SET_MODULE('Records Processed: ' ||
        lv_count_num, 'Elapsed: ' || (DBMS_UTILITY.GET_TIME -
        lv_start_time_num)/100 || ' sec');
    END;
    /
      

  4.   

    -- 详细请看:-- 10.6 将数据类型、IF语句的排列和 PLS_INTEGER 标准化 ( P396 )
    -- 可以在标准的 PL/SQL 开发中引入部分小幅度的编程修改以提高性能。本节将介绍3种方法。
    -- *01). 确保比较运算中的数据类型相同
    -- *02). 根据条件出现的频率来排序IF条件
    -- *03). 使用PLS_INTEGER PL/SQL 数据类型进行整数运算-- 10.6.1 确保比较运算中的数据类型相同
    -- 当变量或者常量值互相比较时,它们应该有相同的数据类型定义。当比较牵涉到不同的数据类型时,Oracle将会自动转换其中的一个数值,这样就产生了额外的不希望的开销。
    -- 无论何时在一个条件中进行数值比较,参与比较的数值必须是同一种数据类型。在开发PL/SQL程序单元时必须遵循这种标准,这也是很好的编程风格。-- 下面的程序清单解释了在比较中采用不同数据类型的代价,也就是在IF语句中将一个数字的数据类型和字符值相比较。
    CREATE OR REPLACE PROCEDURE test_if (p_condition_num NUMBER) AS
      lv_temp_num NUMBER := 0;
      lv_temp_cond_num NUMBER := p_condition_num;
    BEGIN
      stop_watch.start_timer;
      FOR lv_count_num IN 1..100000 LOOP
        IF lv_temp_cond_num = '1' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = '2' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = '3' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = '4' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = '5' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = '6' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = '7' THEN
          lv_temp_num := lv_temp_num + 1;
        ELSE
          lv_temp_num := lv_temp_num + 1;
        END IF;
      END LOOP;
      stop_watch.stop_timer;
    END;
    /-- 以下程序清单展示了如何执行 test_if 过程。
    EXECUTE test_if(8)-- 以下输出结果展示了执行 test_if 程序的结果。
    scott@SZTYORA> EXECUTE test_if(8)
    Total Time Elapsed:         .26 sec Interval Time:         .26 sec-- 不同的数据类型造成了不必要的开销。如果过程中参与比较的数值采用相同的数据类型,那么以下程序清单中过程的执行速度将更快一些:
    CREATE OR REPLACE PROCEDURE test_if (p_condition_num NUMBER) AS
      lv_temp_num NUMBER := 0;
      lv_temp_cond_num NUMBER := p_condition_num;
    BEGIN
      stop_watch.start_timer;
      FOR lv_count_num IN 1..100000 LOOP
        IF lv_temp_cond_num = 1 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 2 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 3 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 4 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 5 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 6 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 7 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSE
          lv_temp_num := lv_temp_num + 1;
        END IF;
      END LOOP;
      stop_watch.stop_timer;
    END;
    / -- 以下程序清单展示了新的 test_if 程序的执行情况。
    scott@SZTYORA> EXECUTE test_if(8)
    Total Time Elapsed:         .17 sec Interval Time:         .17 sec-- 正如以上程序清单中所示,速度提高了23%。执行的频率越高,这种改进越明显。----------------------------------------------------------------------------------------------------------------------------------
    -- 技巧:
    -- 确保所有比较条件中的比较值具有相同的数据类型。另外,确保同属于一类数值类型的比较值具有相同的子数据类型是很有帮助的。因此,在最后的示例中,
    -- IF语句中的比较量和1、2、3等进行比较,也就是将NUMBER类型与PLS_INTEGER类型进行比较。这仍然将造成Oracle类型转换的开销。
    -- 要消除这种开销,应当将1、2、3等数改成 1.0,2.0,3.0 ... ...如果最后的示例做了这种修改,执行时间将降低到26s。
    ------------------------------------------------------------------------------------------------------------------------------------ 10.6.2 根据条件出现的频率来排序 IF 条件 ( P398 )
    -- 当编写带有多重条件的 IF 语句时,合理的编程方法就是按照某些特定顺序来进行条件检查。较为典型的顺序就是按照字母顺序或者数字顺序排列的,以使代码段的可读性更强,
    -- 但它往往不是最优的顺序。尤其是在IF语句中使用了多次的ELSIF条件,最常满足的条件应首先出现,其次是较容易满足的条件,依此类推。-- 在前面一节中,程序的执行首先总是传递参数8,这意味着每次循环都必须检查IF语句的8个条件操作,以便确定是否满足条件。如果传递的是1,
    -- 就表示第一个条件满足了所有的IF执行条件,这样我们就得到了一个更加优化的结果,如下所示:
    EXECUTE test_if(1)
    Total Time Elapsed:         .02 sec Interval Time:         .02 secPL/SQL 过程已成功完成。-- 以上输出结果说明了在IF条件语句中采用最有效的顺序,可显著提高性能。因此,在进行条件编码时,应当进一步分析IF语句的条件执行顺序,以确保最高的效率。----------------------------------------------------------------------------------------------------------------------------------
    -- 技巧:
    -- 确保PL/SQL的IF条件语句以最经常满足的条件为排列顺序,而不是基于数字或者字母的顺序。
    ------------------------------------------------------------------------------------------------------------------------------------ 10.6.3 使用 PLS_INTEGER PL/SQL 数据类型进行整数运算 ( P399 )
    -- 声明数据类型的通用标准是使用NUMBER数据类型。在PL/SQL 2.2版本中,Oracle引入了PLS_INTEGER数据类型。这种数据类型可以用于代替各种数值数据系列类型的声明中,
    -- 只要变量的值是一个整数,并且在-2147483647 到 +2147483647 的范围内。因此,绝大部分计数器和操作符都可以使用这种数据类型。PLS_INTEGER 可以使用更少的内部命令来处理,
    -- 因此使用这种数据类型就提高了性能。这种变量用的越多,性能的提高就越明显。-- 以下程序清单展示了这样的提高。代码段与前面两节中的示例基本相同,但数据类型的声明从NUMBER改为了PLS_INTEGER。
    CREATE OR REPLACE PROCEDURE test_if (p_condition_num PLS_INTEGER) AS
      lv_temp_num PLS_INTEGER := 0;
      lv_temp_cond_num PLS_INTEGER := p_condition_num;
    BEGIN
      stop_watch.start_timer;
      FOR lv_count_num IN 1..100000 LOOP
        IF lv_temp_cond_num = 1 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 2 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 3 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 4 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 5 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 6 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSIF lv_temp_cond_num = 7 THEN
          lv_temp_num := lv_temp_num + 1;
        ELSE
          lv_temp_num := lv_temp_num + 1;
        END IF;
      END LOOP;
      stop_watch.stop_timer;
    END;
    / -- 以下程序清单展示了如何执行 test_if 过程。
    scott@SZTYORA>  EXECUTE test_if(1);
    Total Time Elapsed:         .01 sec Interval Time:         .01 secPL/SQL 过程已成功完成。----------------------------------------------------------------------------------------------------------------------------------
    -- 技巧:
    -- 处理整数时使用 PLS_INTEGER 类型,可以提高性能。
    ----------------------------------------------------------------------------------------------------------------------------------