动态SQL的常见错误
作者:网络转载 发布时间:[ 2013/4/17 9:57:26 ] 推荐标签:
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子句来传递。

sales@spasvo.com