任何人都可以从转储中帮助我吗?

时间:2013-07-28 23:24:54

标签: oracle function stored-procedures plsql

查看图表1并检查员工表的结构:

desc employees
Name                           Null     Type
-------------------------------------------------
EMPLOYEE_ID                    NOT NULL NUMBER(6)
FIRST_NAME                              VARCHAR2(20)
LAST_NAME                      NOT NULL CHAR(25)
EMAIL                          NOT NULL VARCHAR2(25)
PHONE_NUMBER                            VARCHAR2(20)
HIRE_DATE                      NOT NULL DATE
JOB_ID                         NOT NULL VARCHAR2(10)
SALARY                                  NUMBER(8,2)
COMMISSION_PCT                          NUMBER(2,2)
MANAGER_ID                              NUMBER(6)
DEPARTMENT_ID                           NUMBER(4)

查看图表2并检查代码:

CREATE OR REPLACE FUNCTION increase
    (emp_num NUMBER) RETURN NUMBER
IS
  inc_amt NUMBER;
  sal     NUMBER;
BEGIN
  SELECT salary INTO sal FROM employees WHERE employee_id = emp_num;

  inc_amt := sal*10;
  RETURN inc_amt;

END increase;
/

CREATE OR REPLACE PROCEDURE calc_sal IS
  emp_num NUMBER(7) := 120;
  amt     NUMBER    :=0;

  PROCEDURE raise_salary
    (emp_id NUMBER)
  IS
  BEGIN
    amt := increase(emp_num);

    UPDATE employees SET salary = salary+amt WHERE employee_id=emp_id;  
  END raise_salary;

BEGIN
  raise_salary(emp_num);
END calc_sal;
/  

执行代码的结果是什么?

A.Both会在调用时成功编译并执行。

B.Both块编译成功,但CALC_SAL过程在执行时出错。

C.CALC_SAL过程在编译时出错,因为amt变量应该在RAISE_SALARY过程中声明。

D.CALC_SAL过程在编译时出错,因为RAISE_SALARY过程无法调用独立增加函数。

我之所以选择B是因为我编译了函数和过程并且编译成功,但是我尝试调用(执行)过程calc_sal并且它给了我错误。

你可以向我解释一下这个错误的原因是什么?我的回答是正确还是错误?因为在转储中答案是A

我使用以下代码调用该过程:

begin
calc_sal;
end;

我得到的错误:

Error report:
ORA-01438: value larger than specified precision allowed for this column
ORA-06512: at "HR.CALC_SAL", line 7
ORA-06512: at "HR.CALC_SAL", line 11
ORA-06512: at line 2
01438. 00000 -  "value larger than specified precision allowed for this column"
*Cause:    When inserting or updating records, a numeric value was entered
           that exceeded the precision defined for the column.
*Action:   Enter a value that complies with the numeric column's precision,
           or use the MODIFY option with the ALTER TABLE command to expand
           the precision.

和employee_id列有107名员工他们的数字从100到206。

1 个答案:

答案 0 :(得分:0)

正如Bob的评论正确陈述,代码确实正常,因此测验答案 A 是可辩护的。

您说 B 因为您收到此错误:

  

ORA-01438:大于此指定精度的值   柱

这是一个数据问题。函数CALC_SAL()将成功提供SAL + SAL*10是< = 999999.99,这个最大值将适合定义为NUMBER(8,2)的列。因此,要么您的表格没有按照您认为的方式定义,要么员工的原始薪水比您认为的要高。