returning_ void function returning a value 什么意思? - CSDN
精华内容
参与话题
  • ORACLE:RETURNING 子句

    千次阅读 2014-09-28 09:38:08
    RETURNING 自己通常结合DML 语句使用。(INSERT UPDATE DELETE) 使用方法: UPDATE table_name SET expr1 RETURNING column_name INTO xxx INSERT: 返回的是添加后的值 UPDATE:返回时更新后的值 ...

    RETURNING 自己通常结合DML 语句使用。(INSERT UPDATE DELETE)

    使用方法:

    UPDATE table_name SET expr1
    RETURNING column_name
    INTO xxx

    INSERT: 返回的是添加后的值
    UPDATE:返回时更新后的值

    DELETE:返回删除前的值

    RETURNING 可以再sqlplus 和plsql中使用

    如果是plsql就如上面的代码,xxx为声明的变量名

    如果是sqlplus,xxx 可以为变量,即

    VARIABLE var_name varchar2(10)
    UPDATE table_name SET expr1
    RETURNING column_name INTO :var_name;

    这里的 :var_name  使用的是绑定变量


    另外,RETURNING 貌似可以与 RETURN通用

    INSERT INTO VALUES 支持 RETURNING 

    INSERT INTO SELECT、 和MERGE 语句 不支持 RETURNING

     

    再另外,RETURNING 可以与BULK COLLECT 结合(批量绑定, 另外一个是 FORALL)

    复制代码
    DECLARE
    TYPE table_type IS TABLE OF column_name%TYPE;
    v_tab table_type;
    BEGIN
      UPDATE table_name
      SET expr1
      RETURNING column_name BULK COLLECT INTO v_tab;
    
      FOR i IN v_tab.first .. v_tab.last LOOP
      DBMS_OUTPUT.put_line( l_tab(i));
    END LOOP;
    
    COMMIT;
    END;
    /
    展开全文
  • RETURNING

    2012-07-28 19:41:27
    利用 DML的RETURNING 语句可以返回刚刚操作的记录的信息,然后可以马上用于判断,这样避免了再次使用SQL语句做一次SELECT,提高了程序的性能,具体例子如下,注意UPDATE和DELETE返回值的差别: CREATE OR REPLACE ...

    利用 DML的RETURNING 语句可以返回刚刚操作的记录的信息,然后可以马上用于判断,这样避免了再次使用SQL语句做一次SELECT,提高了程序的性能,具体例子如下,注意UPDATE和DELETE返回值的差别:

    CREATE OR REPLACE PROCEDURE test_returning
    IS
     v_empno emp.empno%TYPE;
     v_ename emp.ename%TYPE;
     v_sal emp.sal%TYPE;
    BEGIN
     INSERT INTO emp(empno,ename,sal)VALUES(1234,'SHADOW',4000)
     RETURNING ename,sal INTO v_ename,v_sal;
     dbms_output.put_line(SQL%ROWCOUNT);
     dbms_output.put_line(v_ename);
     dbms_output.put_line(v_sal);

     UPDATE emp SET sal=3000 WHERE empno=1234
     RETURNING ename,sal INTO v_ename,v_sal;
     dbms_output.put_line(SQL%ROWCOUNT);
     dbms_output.put_line(v_ename);
     dbms_output.put_line(v_sal);
     
     DELETE FROM emp WHERE empno=1234
     RETURNING ename,sal INTO v_ename,v_sal;
     dbms_output.put_line(SQL%ROWCOUNT);
     dbms_output.put_line(v_ename);
     dbms_output.put_line(v_sal);
    END;
    /

    运行如下:

    SQL> @g:/orcl/returning.sql

    过程已创建。

    SQL> exec test_returning
    1
    SHADOW
    4000
    1
    SHADOW
    3000
    1
    SHADOW
    3000

    PL/SQL 过程已成功完成。

     

    参考http://hi.baidu.com/kongzong/blog/item/184f97cafd39ff86c8176825.html 

    展开全文
  • Oracle returning 详解

    2019-01-20 11:00:57
    0、基础数据 CREATE TABLE student( SID NUMBER(10), Sname VARCHAR2(10) ); INSERT INTO student(SID, sname) VALUES(1, 'a'); INSERT INTO student(SID, sname) ...INSERT INTO student(SID, sna...

    1、使用场景

    在存储过程、PL/SQL 块里需要 返回 insert、delete、updatedml 语句后的信息时使用,合理使用 returning 能够简化程序逻辑(少一次 select into)、提高程序性能

    1.2、基础数据

    DROP TABLE stu; -- if exists
    
    CREATE TABLE stu (
      s_id NUMBER,
      s_xm VARCHAR2(30)
    );
    
    INSERT INTO stu(s_id, s_xm) VALUES(1, '小游子');
    INSERT INTO stu(s_id, s_xm) VALUES(2, '小优子');
    INSERT INTO stu(s_id, s_xm) VALUES(3, '小倩子');
    
    COMMIT;
    

    2、实例分析

    2.1 insert、update、delete 修改单行记录

    • insert、update 是提取 操作后 的数据
    • delete 是提取 操作前 的数据
    DROP TABLE stu1; -- if exists
    
    CREATE TABLE stu1 AS SELECT * FROM stu WHERE 1 = 2;
    
    
    DECLARE
       v_xm system.stu.s_xm%TYPE;
    BEGIN
       INSERT INTO stu(s_id, s_xm) VALUES (1, '小游子') RETURNING s_xm INTO v_xm;
       dbms_output.put_line('插入后的 s_xm :' || v_xm);
       v_xm:= NULL;
    
       UPDATE stu SET s_xm = '小优子' WHERE s_id = 1 RETURNING s_xm INTO v_xm;
       dbms_output.put_line('修改后的 s_xm :' || v_xm);
       v_xm:= NULL;
       
       DELETE stu WHERE s_id = 1 RETURNING s_xm INTO v_xm;
       dbms_output.put_line('删除前的 s_xm :' || v_xm);
    
    EXCEPTION
       WHEN OTHERS THEN
          dbms_output.put_line(SQLCODE || ' : ' || SQLERRM);
          dbms_output.put_line(dbms_utility.format_error_backtrace);
    END;
    

    测试结果:
    在这里插入图片描述

    2.1.1 + 动态sql

    returning into 在 动态sql内部和外面都要写,且外面的 returning 后面不加字段直接 into

    TRUNCATE TABLE stu;
    
    INSERT INTO stu(s_id, s_xm) VALUES(1, '小游子');
    INSERT INTO stu(s_id, s_xm) VALUES(2, '小优子');
    INSERT INTO stu(s_id, s_xm) VALUES(3, '小倩子');
    
    COMMIT;
    -------- 以上为:数据准备 --------
    DECLARE
       v_id system.stu.s_id%TYPE; 
       v_xm system.stu.s_xm%TYPE;
       v_sql VARCHAR(200);
    BEGIN
       v_sql := 'UPDATE stu SET s_xm = ''a'' WHERE s_id = :b1 RETURNING s_id, s_xm INTO :b2, :b3';
       
       EXECUTE IMMEDIATE v_sql USING 3 RETURNING INTO v_id, v_xm; -- 内外 returning 都要写
       
       ROLLBACK;
    
       dbms_output.put_line(v_id||' : '||v_xm);
    EXCEPTION
       WHEN OTHERS THEN
          dbms_output.put_line(SQLCODE || ' : ' || SQLERRM);
          dbms_output.put_line(dbms_utility.format_error_backtrace);
    END;
    

    2.2 record + table 修改多行记录

    TRUNCATE TABLE stu;
    
    INSERT INTO stu(s_id, s_xm) VALUES(1, '小游子');
    INSERT INTO stu(s_id, s_xm) VALUES(2, '小优子');
    INSERT INTO stu(s_id, s_xm) VALUES(3, '小倩子');
    
    COMMIT;
    -------- 以上为:数据准备 --------
    DECLARE
       TYPE stu_record IS RECORD(
          v_id system.stu.s_id%TYPE,
          v_xm system.stu.s_xm%TYPE);
       TYPE stu_table IS TABLE OF stu_record INDEX BY PLS_INTEGER;
       v_stu_table stu_table;
       
    BEGIN
       UPDATE stu t SET t.s_xm = 'a' WHERE 1 = 1 RETURNING t.s_id, t.s_xm BULK COLLECT INTO v_stu_table;
       ROLLBACK; 
       FOR i IN v_stu_table.first .. v_stu_table.last LOOP
          dbms_output.put_line(v_stu_table(i).v_id||' : '||v_stu_table(i).v_xm);
       END LOOP;
    EXCEPTION
       WHEN OTHERS THEN
          dbms_output.put_line(SQLCODE || ' : ' || SQLERRM);
          dbms_output.put_line(dbms_utility.format_error_backtrace);
    END;
    

    测试结果:
    在这里插入图片描述

    2.2.1 + 动态sql

    动态sql 内部仍然是 returning into 而不是 returning bulk collect into

    2.2.1.1 returning 支持 table

    TRUNCATE TABLE stu;
    
    INSERT INTO stu(s_id, s_xm) VALUES(1, '小游子');
    INSERT INTO stu(s_id, s_xm) VALUES(2, '小优子');
    INSERT INTO stu(s_id, s_xm) VALUES(3, '小倩子');
    
    COMMIT;
    -------- 以上为:数据准备 --------
    DECLARE
       TYPE stu_id_table IS TABLE OF system.stu.s_id%TYPE;
       TYPE stu_xm_table IS TABLE OF system.stu.s_xm%TYPE;
       
       v_id stu_id_table;
       v_xm stu_xm_table;
       
       v_sql VARCHAR2(2000);
    BEGIN
       v_sql := 'UPDATE stu t SET t.s_xm = ''a'' WHERE t.s_id <= :b1 
                   RETURNING t.s_id, t.s_xm INTO :b2, :b3';
       
       EXECUTE IMMEDIATE v_sql USING 3 RETURNING BULK COLLECT INTO v_id, v_xm;
       ROLLBACK;
       
       FOR i IN v_id.first .. v_id.last LOOP
          dbms_output.put_line(v_id(i));
       END LOOP;
       
       dbms_output.new_line();
       
       FOR i IN v_xm.first .. v_xm.last LOOP
          dbms_output.put_line(v_xm(i));
       END LOOP;
       
    EXCEPTION
       WHEN OTHERS THEN
          dbms_output.put_line(SQLCODE || ' : ' || SQLERRM);
          dbms_output.put_line(dbms_utility.format_error_backtrace);
    END;
    

    测试结果:
    在这里插入图片描述

    2.2.1.2 returning 不支持 record

    TRUNCATE TABLE stu;
    
    INSERT INTO stu(s_id, s_xm) VALUES(1, '小游子');
    INSERT INTO stu(s_id, s_xm) VALUES(2, '小优子');
    INSERT INTO stu(s_id, s_xm) VALUES(3, '小倩子');
    
    COMMIT;
    -------- 以上为:数据准备 --------
    DECLARE
       TYPE stu_record IS RECORD(
          v_id system.stu.s_id%TYPE,
          v_xm system.stu.s_xm%TYPE);
       TYPE stu_table IS TABLE OF stu_record INDEX BY PLS_INTEGER;
       v_stu_table stu_table;
       v_sql VARCHAR2(30);
    BEGIN
       v_sql := 'UPDATE stu t SET t.s_xm = ''a'' WHERE t.s_id := b1
                   RETURNING t.s_id, t.s_xm INTO :b2';
                   
       EXECUTE IMMEDIATE v_sql USING 1  RETURNING BULK COLLECT INTO v_stu_table;          
       ROLLBACK; 
       
       FOR i IN v_stu_table.first .. v_stu_table.last LOOP
          dbms_output.put_line(v_stu_table(i).v_id||' : '||v_stu_table(i).v_xm);
       END LOOP;
       
    EXCEPTION
       WHEN OTHERS THEN
          dbms_output.put_line(SQLCODE || ' : ' || SQLERRM);
          dbms_output.put_line(dbms_utility.format_error_backtrace);
    END;
    

    测试结果:
    在这里插入图片描述

    展开全文
  • RETURNING语句

    千次阅读 2019-03-19 14:36:55
    1.DELETE的情况,RETURNING返回的肯定是DELETE之前的结果; INSERT的情况,RETURNING返回的一定是INSERT之后的结果。 UPDATE的情况,RETURNING返回的一定是UPDATE之后的结果。 2.RETURNING语句似乎和RETURN通用。...

    1.DELETE的情况,RETURNING返回的肯定是DELETE之前的结果;

      INSERT的情况,RETURNING返回的一定是INSERT之后的结果。

      UPDATE的情况,RETURNING返回的一定是UPDATE之后的结果。


    2.RETURNING语句似乎和RETURN通用。(即两个可以相互替换)

    3.INSERT INTO VALUES语句支持RETURNING语句,而INSERT INTO SELECT语句不支持。

    4.MERGE语句不支持RETURNING语句。
     

    ORACLE的DML语句中可以指定RETURNING语句。RETURNING语句的使用在很多情况下可以简化PL/SQL编程。

     

    在使用RETURNING子句是应注意以下几点限制:
      1.不能与DML语句和远程对象一起使用;
      2.不能检索LONG类型信息;
      3.当通过视图向基表中插入数据时,只能与单基表视图一起使用。 


    问题:
    使用UPDATE语句的时候,RETURNING得到的结果是UPDATE之前的结果还是UPDATE之后的结果?

    例:

     

     

     

    SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
    
    表已创建。

     

    SQL> SET SERVEROUT ON
    SQL> DECLARE
     V_NAME VARCHAR2(30);
     BEGIN
     INSERT INTO T VALUES (1, 'YANGTK') RETURNING NAME INTO V_NAME;
     DBMS_OUTPUT.PUT_LINE('INSERT: ' || V_NAME);
     V_NAME := NULL;
     UPDATE T SET NAME = 'YTK' RETURNING NAME INTO V_NAME;
     DBMS_OUTPUT.PUT_LINE('UPDATE: ' || V_NAME);
     V_NAME := NULL;
     DELETE T RETURNING NAME INTO V_NAME;
     DBMS_OUTPUT.PUT_LINE('DELETE: ' || V_NAME);
     END;
     /
    INSERT: YANGTK
    UPDATE: YTK
    DELETE: YTK
    
    PL/SQL 过程已成功完成。


    显然,UPDATE操作的RETURNING语句是返回UPDATE操作之后的结果。

    顺便总结几个RETURNING操作相关的问题:


    1.RETURNING语句似乎和RETURN通用。

     

     

     

    SQL> SET SERVEROUT ON
    SQL> DECLARE
     V_NAME VARCHAR2(30);
     BEGIN
     INSERT INTO T VALUES (1, 'YANGTK') RETURN NAME INTO V_NAME;
     DBMS_OUTPUT.PUT_LINE('INSERT: ' || V_NAME);
     V_NAME := NULL;
     UPDATE T SET NAME = 'YTK' RETURN NAME INTO V_NAME;
     DBMS_OUTPUT.PUT_LINE('UPDATE: ' || V_NAME);
     V_NAME := NULL;
     DELETE T RETURN NAME INTO V_NAME;
     DBMS_OUTPUT.PUT_LINE('DELETE: ' || V_NAME);
     END;
     /
    INSERT: YANGTK
    UPDATE: YTK
    DELETE: YTK
    
    PL/SQL 过程已成功完成。

     



    2.RETURNING语句也可以使用SQLPLUS的变量,这样,RETURNING语句不一定非要用在PL/SQL语句中。

     

     

     

     

    SQL> VAR V_NAME VARCHAR2(30)
    SQL> INSERT INTO T VALUES (1, 'YANGTK') RETURNING NAME INTO :V_NAME;
    
    已创建 1 行。
    
    
    SQL> PRINT V_NAME
    
    
    V_NAME
    --------------------------------
    YANGTK
    
    
    SQL> UPDATE T SET NAME = 'YTK' RETURNING NAME INTO :V_NAME;
    
    
    已更新 1 行。
    
    
    SQL> PRINT V_NAME
    
    
    V_NAME
    --------------------------------
    YTK
    
    
    SQL> DELETE T RETURNING NAME INTO :V_NAME;
    
    
    已删除 1 行。
    
    
    SQL> PRINT V_NAME
    
    
    V_NAME
    --------------------------------
    YTK

     




    3.INSERT INTO VALUES语句支持RETURNING语句,而INSERT INTO SELECT语句不支持。MERGE语句不支持RETURNING语句。

     

     

     

     

    SQL> MERGE INTO T USING (SELECT * FROM T) T1
     ON (T.ID = T1.ID)
     WHEN MATCHED THEN UPDATE SET NAME = T1.NAME
     WHEN NOT MATCHED THEN INSERT VALUES (T1.ID, T1.NAME)
     RETURNING NAME INTO :V_NAME;
     RETURNING NAME INTO :V_NAME
    *第 5 行出现错误:
    ORA-00933: SQL 命令未正确结束

     

    SQL> INSERT INTO T SELECT * FROM T RETURNING NAME INTO :V_NAME;
    INSERT INTO T SELECT * FROM T RETURNING NAME INTO :V_NAME
    *第 1 行出现错误:
    ORA-00933: SQL 命令未正确结束

     

    展开全文
  • Returning Into子句研究

    2011-11-02 11:32:36
      在对数据表进行dml操作(Insert、Update和delete)的时候,有时会需要获取到进行操作的数据。最简单的方法就是在DML操作之前或者之后进行一下select操作,将数据获取到。...SQL的returning into子句。 Ret
  • oracle存储过程中 RETURNING INTO的含义

    千次阅读 2018-11-07 13:21:47
    DECLARE Row_id ROWID; info VARCHAR2(40); BEGIN INSERT INTO dept VALUES (91, 'SERVICE', 'BEIJING') RETURNING rowid,dname||':'||to_char(deptno)||':'||loc ...
  • Spring AOP(二)之AfterReturning增强处理

    万次阅读 2016-03-06 12:24:44
    类似于使用@Before注解可以修饰Before增强处理,使用@AfterReturning可修饰AfterReturning增强处理,AfterReturning增强处理将在目标方法正常完成后被织入。 使用@AfterReturning注解可指定如下两个常用属性。 1)...
  • mapper接口中的参数需要加上@Param(value="xxx"),如:getComFairList(@Param(value = "comCode") String comCode)
  • 比较低级的错误,malloc函数的库为:stdlib.h.记录一下,备忘.
  • spring注解切面@AfterReturning取返回值

    千次阅读 2018-12-13 15:22:01
    /** * 案件状态更新的通知 * * @param joinPoint ... @AfterReturning(value = "alertsCaseInfoPointcut()", returning = "result") public void doAfterUpdateCaseInfoStatus(JoinPoi...
  • @AfterReturning配置

    万次阅读 2014-07-03 11:34:21
    AfterReturning和before,after,around不同是
  • 在使用ssm框架的时候,出现了查询结果为null 的问题。 在不断的测试代码之后,发现。出现此类的问题一般都为使用了 逆向工程 导致的原因是 pojo中的类名称 与 数据库 mysql中的名称不一致。 在自己修改了逆向工程...
  • 出现警告:incompatible pointer types returning from a function with result type的解决办法  - (UIViewController *)masterViewController { if (_viewControllers && [_viewControllers count] > 0) { ...
  • 原文地址:http://blog.sina.com.cn/s/blog_771bd2c901010n1f.html 因为在stdio.h这个头文件里面没有包含exit()函数,exit()函数所在的头文件在stdlib.h和process.h中 ...2)相互独立性:标准头文件之间不可
  • PostgreSQL 使用RETURNING返回值

    万次阅读 2015-04-21 16:14:26
    PostgreSQL 使用RETURNING返回值
  • springAop @AfterReturning注解 获取返回值

    千次阅读 2019-06-22 13:59:12
    @AfterReturning(returning="rvt", pointcut="@annotation(com.sinosoft.redis.cache.PutCache)") public Object AfterExec(JoinPoint joinPoint,Object rvt){  rvt 这个就是方法返回值 } 转载于:...
  • assuming extern returning int warning C4013: '_beginthread' undefined; assuming extern returning int 解决办法: 在建立多线程的Windows程序时,需要在「Project Settings」对话框中做一些修改。选择
  • Spring AOP 配置after-returning时异常问题

    千次阅读 2017-11-17 23:26:56
    调试代码的时候发现如果在使用spring aop时想要在...当xml配置为<aop:after-returning method="afterReturning" pointcut-ref="servicePointcut" />程序可以正常在切点后面加入增强事务,但是一旦添加了returning属性Sp
  • 在eclipse中写类的成员函数时,提示错误Return has value, in function returning void,编译后报错:错误:a function-definition is not allowed here before '{' toke...... 错误原因:经检查,是该成员函数前面...
  • UIWebView加载的网址链接是我们后台给的一个H5的链接, 但是我们发现在iOS9系统上可以正常加载网页内容, 在iOS10系统上却无法加载, 会出现以下Log信息:WF: _userSettingsForUser mobile: { filterBlacklist = ( ...
1 2 3 4 5 ... 20
收藏数 99,695
精华内容 39,878
关键字:

returning