PL/SQL中使用NEW关键字与不使用创建对象的差异
在Oracle PL/SQL中创建对象时,使用NEW和不使用NEW的处理差异?
在Oracle PL/SQL中,使用NEW关键字和直接调用对象类型名来创建对象,Oracle的处理逻辑完全一致,没有功能差异——两种写法最终都会调用对应的构造函数(默认构造函数或自定义构造函数)完成对象实例化。
示例说明
首先定义自定义对象类型及类型体(修正了原示例中的语法错误):
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT, MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); / CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line('Constructor fired..'); SELF.emp_no:=p_emp_no; SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no, emp_name, salary, manager); END; MEMBER PROCEDURE display_records IS BEGIN Dbms_output.put_line('Employee Name:'||emp_name); Dbms_output.put_line('Employee Number:'||emp_no); Dbms_output.put_line('Salary:'||salary); Dbms_output.put_line('Manager:'||manager); END; END; /
不使用NEW创建对象
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,'RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
使用NEW创建对象
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:= new emp_object(1005,'RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
关键结论
- 两种写法都会触发构造函数的执行:运行上述两段PL/SQL代码,控制台都会输出
Constructor fired..,说明自定义构造函数被成功调用。 - 功能完全等价:无论是否使用
NEW,最终生成的对象实例、执行的逻辑、对数据库的操作(如示例中的插入数据)都完全一致。 - 语法来源差异:
NEW是SQL标准规定的对象实例化语法,Oracle提供该写法以兼容标准;而省略NEW是Oracle PL/SQL的简化语法,为开发提供便捷。
内容的提问来源于stack exchange,提问作者nightfox79
相关产品推荐
相关产品推荐

