2013-07-28 162 views
0

查看图表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; 
/ 

执行代码时是什么结果?

答:在调用时,两个块都能成功编译和执行。

B.两个块都成功编译,但CALC_SAL过程给出了执行时的错误。

C. CALC_SAL过程给编译带来了一个错误,因为amt变量应该在RAISE_SALARY过程中声明。

D.由于RAISE_SALARY过程不能调用独立增加函数,因此CALC_SAL过程给出编译时的错误。

我选择了B,因为我编译函数和过程并且它的编译很成功,但我试图调用(执行)过程calc_sal并给出错误。

你能向我解释这个错误的原因是什么,我的答案是正确还是错误?因为在转储答案是

我调用的程序与此代码:

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.

+0

@Bob Jarvis 可以请你如果亲切地解释这个问题 –

+0

什么错误产生? –

+0

请编辑您的文章并添加您编写的代码以调用CALC_SAL。 EMPLOYEE_ID = 120的EMPLOYEES表中有哪些数据?谢谢。 –

回答

0

由于鲍勃的评论正确地陈述,代码确实工作正常,所以测验答案A是defensi BLE。

你说,因为你得到这个错误:

ORA-01438: value larger than specified precision allowed for this column

这是一个数据问题。函数CALC_SAL()将成功提供SAL + SAL*10为< = 999999.99,这个最大值将适合定义为NUMBER(8,2)的列。因此,无论您的桌子是按照您认为的方式定义的,还是您认为的员工的原始薪水都较高。

+0

谢谢你解释@Bob Jarvis –

+0

谢谢你解释@APC –

相关问题