如何从查询结果向Oracle自定义对象赋值?
Oracle自定义对象从单行查询赋值的解决方案
你定义的自定义对象类型如下:
CREATE TYPE SOME_CUSTOM_OBJ FORCE AS OBJECT( ID number, Name varchar(30) );
你尝试直接在构造函数中嵌套SELECT语句的写法不符合Oracle语法,这里提供两种无需创建对象表的可行方案:
方案一:直接在SELECT中构造对象并赋值
这是最简洁的方式,直接在查询语句里调用对象构造函数,将查询到的列作为参数传入,通过INTO子句把构造好的对象赋值给变量:
DECLARE SOME_OBJECT SOME_CUSTOM_OBJ; BEGIN SELECT SOME_CUSTOM_OBJ(ID, NAME) INTO SOME_OBJECT FROM ANTHER_TABLE WHERE {SOME CONDITIONS} AND rownum = 1; DBMS_OUTPUT.PUT_LINE(SOME_OBJECT.ID); END; /
方案二:分步查询列值再构造对象
如果需要分步处理,可以先查询出单个列的值,再用构造函数创建对象,或者初始化对象后逐个赋值属性:
DECLARE SOME_OBJECT SOME_CUSTOM_OBJ; v_id NUMBER; v_name VARCHAR2(30); BEGIN -- 先查询单行的列值 SELECT ID, NAME INTO v_id, v_name FROM ANTHER_TABLE WHERE {SOME CONDITIONS} AND rownum = 1; -- 方式1:用查询到的值调用构造函数 SOME_OBJECT := SOME_CUSTOM_OBJ(v_id, v_name); -- 方式2:先初始化对象,再逐个赋值属性 -- SOME_OBJECT := SOME_CUSTOM_OBJ(NULL, NULL); -- SOME_OBJECT.ID := v_id; -- SOME_OBJECT.NAME := v_name; DBMS_OUTPUT.PUT_LINE(SOME_OBJECT.ID); END; /
注意事项
- 确保你的查询语句确实只会返回单行数据,否则会抛出
NO_DATA_FOUND或TOO_MANY_ROWS异常; - 注意代码中对象类型名的一致性(你示例中出现了
SOME_CUSTOM_OBJ和SOME_CUSTOM_OBJECT的拼写差异,需要统一)。
内容的提问来源于stack exchange,提问作者Chacha
相关产品推荐
相关产品推荐

