8、单行SELECT 查询不能使用RETURNING INTO返回

  下面的示例中,使用了动态的单行SELECT查询,并且使用了RETURNING子句来返回值。事实上,RETURNING coloumn_name INTO 子句仅仅支持对DML结果集的返回,因此,收到了错误提示。

DECLARE
         sql_stat VARCHAR2(200);
         v_empno  tb2.empno%TYPE := &eno;
         v_ename  tb2.ename%TYPE;
    
       BEGIN
         sql_stat := 'SELECT ename FROM tb2 WHERE empno =:eno
                      RETURNING ename INTO :v_ename ';
         EXECUTE IMMEDIATE sql_stat
           USING v_empno
           RETURNING INTO v_ename;
         DBMS_OUTPUT.PUT_LINE('The employee name is ' || v_ename);
       END;

  处理办法

  去掉动态SQL语句中的RETURNING coloumn_name INTO子句,在执行EXECUTE IMMEDIATE时,直接使用INTO子句来传递值。

DECLARE
         sql_stat VARCHAR2(200);
         v_empno  tb2.empno%TYPE := &eno;
         v_ename  tb2.ename%TYPE;
    
       BEGIN
         sql_stat := 'SELECT ename FROM tb2 WHERE empno =:eno';
                --       RETURNING ename INTO :v_ename ';     --去掉RETURNING子句
         EXECUTE IMMEDIATE sql_stat
           INTO v_ename                                        --增加INTO子句来返回变量值
           USING v_empno;
           --RETURNING INTO v_ename;                           --去掉RETURNING子句
         DBMS_OUTPUT.PUT_LINE('The employee name is ' || v_ename);
       END;

  三、总结

  1、使用动态DDL时,不能使用绑定变量。应该将绑定变量与原动态SQL使用连接符进行连接。

  2、不能使用schema对象作为绑定参数,将schema对象与原动态SQL使用连接符进行连接。

  3、动态SQL块不能使用分号结束(;)。

  4、动态PL/SQL块不能使用正斜杠来结束块,但是块结尾处必须要使用分号(;)。

  5、空值传递的时候,不能直接使用USING NULL子句,应当声明变量,使用变量传递,当未给变量赋值时,即为空值。

  6、参数的传入传出应保证顺序的正确,以及防止数据溢出的问题。

  7、日期型或字符型在动态SQL中处理时,需要注意单引号个数的问题,特殊情况下可以使用chr(39)作为单引号使用。

  8、动态SQL中RETURNING INTO返回DML操作的结果,对于SELECT查询返回的结果,在执行EXECUTE IMMEDIATE时,直接使用INTO子句来传递。