oracle RETURNING 子句使用方法
RETURNING自己通常结合DML语句使用。(INSERTUPDATEDELETE)
使用方法:
UPDATEtable_nameSETexpr1 RETURNINGcolumn_name INTOxxx
INSERT:返回的是添加后的值
UPDATE:返回时更新后的值
DELETE:返回删除前的值
RETURNING可以再sqlplus和plsql中使用
如果是plsql就如上面的代码,xxx为声明的变量名
如果是sqlplus,xxx可以为变量,即
VARIABLEvar_namevarchar2(10) UPDATEtable_nameSETexpr1 RETURNINGcolumn_nameINTO:var_name;
这里的:var_name使用的是绑定变量
另外,RETURNING貌似可以与RETURN通用
INSERTINTOVALUES支持RETURNING
INSERTINTOSELECT、和MERGE语句不支持RETURNING
例子1:
建表语句:
CREATETABLETEST111( A1VARCHAR(10), A2VARCHAR(20) ); CREATESEQUENCETEST111_S1 STARTWITH1 INCREMENTBY1 CACHE20 MAXVALUE999999999999999999999999999 CYCLE;
DECLARE SEQNUMBER; BEGIN INSERTINTOTEST111VALUES(TEST111_S1.NEXTVAL,'AAA2') RETURNINGA1INTOSEQ; DBMS_OUTPUT.PUT_LINE(SEQ); END; DECLARE SEQNUMBER; BEGIN INSERTINTOTEST111VALUES(TEST111_S1.NEXTVAL,'AAA3'); SELECTTEST111_S1.CURRVALINTOSEQFROMDUAL; COMMIT; DBMS_OUTPUT.PUT_LINE(SEQ); END;
例子2:
再另外,RETURNING可以与BULKCOLLECT结合(批量绑定,另外一个是FORALL)
DECLARE TYPEtable_typeISTABLEOFcolumn_name%TYPE; v_tabtable_type; BEGIN UPDATEtable_name SETexpr1 RETURNINGcolumn_nameBULKCOLLECTINTOv_tab; FORiINv_tab.first..v_tab.lastLOOP DBMS_OUTPUT.put_line(l_tab(i)); ENDLOOP; COMMIT; END;
ORA-06547:INSERT,UPDATE或DELETE语句必须使用RETURNING子句
产生这个错误的原因:
returninginto子句作用于insert,update,delete,上而select则不行,应该用into。
报错的存储如下:
createorreplaceprocedurep_stu_info(s_idnumber,s_namevarchar2)is v_namevarchar2(10); v_agenumber; v_ErrMsgvarchar2(200); begin executeimmediate'selectname,agefromstudent_testwhereid=:1andname=:2' usings_id,s_name returningintov_name,v_age; dbms_output.put_line(v_name||'的年龄为:'||to_char(v_age)); exception whenothersthen v_ErrMsg:=SUBSTRB(SQLERRM,1,200); dbms_output.put_line('找不到相应学生'); endp_stu_info;
改成下面这样就ok了:
createorreplaceprocedurep_stu_info(s_idnumber,s_namevarchar2)is v_namevarchar2(10); v_agenumber; v_ErrMsgvarchar2(200); begin executeimmediate'selectname,agefromstudent_testwhereid=:1andname=:2' intov_name,v_age usings_id,s_name; dbms_output.put_line(v_name||'的年龄为:'||to_char(v_age)); exception whenothersthen v_ErrMsg:=SUBSTRB(SQLERRM,1,200); dbms_output.put_line('找不到相应学生,错误原因:'||v_ErrMsg); endp_stu_info;