PL/SQL-->动态SQL的常见错误

本文详细介绍了在使用PL/SQL动态SQL时常见的错误,包括动态DDL中绑定变量的禁止、schema对象不能作为绑定参数、动态SQL块的分号与斜杠使用误区,以及空值传递、参数顺序错误等问题。通过实例展示了错误的产生和正确的处理方法,帮助开发者避免这些常见错误。
摘要由CSDN通过智能技术生成
PL/SQL-->动态SQL的常见错误

      动态SQL在使用时,有很多需要注意的地方,如动态SQL语句结尾处不能使用分号(;),而动态PL/SQL结尾处需要使用分号(;),但不能使用正
斜杠结尾(/),以及schema对象不能直接作为变量绑定。本文介绍了动态SQL的常见问题。

 
一、演示动态SQL的使用
      下面的示例中,首先使用动态SQL基于scott.emp创建表tb2,然后直接使用动态SQL从新表中获取记录数并输出。再接下来是定义了一个动态PL/SQL代码并执行以获取当前的系统时间,最后使用动态SQL对新表进行更新。


            DECLARE                                                            --定义变量以及给变量设定初始值
                sql_stmt                VARCHAR2(100);
                plsql_block          VARCHAR2(300);
                v_deptno                NUMBER := 30;
                v_count                  NUMBER;
                v_new_sal              VARCHAR2(5);
                v_empno                  NUMBER := 7900;
            BEGIN
                sql_stmt := 'CREATE TABLE tb_emp ' ||              --为变量赋值,生成动态SQL语句
                                      'AS SELECT * FROM scott.emp WHERE deptno = ' || v_deptno;
                EXECUTE IMMEDIATE sql_stmt;                                  --执行动态SQL语句
           
                EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM tb_emp' --直接使用EXECUTE IMMEDIATE后跟动态SQL串获得新表的记录数
                INTO v_count;

                DBMS_OUTPUT.PUT_LINE('The employee count is : ' || v_count);

                plsql_block := 'DECLARE ' ||                        --声明一个PL/SQL块,存放到变量plsql_block中
                                          ' v_date DATE; ' ||
                                          'BEGIN ' ||
                                          ' SELECT SYSDATE INTO v_date FROM DUAL; ' ||
                                          ' DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_date,''DD-MON-YYYY''));' ||
                                          'END;';
                EXECUTE IMMEDIATE plsql_block;                    --执行动态的PL/SQL块               

                sql_stmt := 'UPDATE tb_emp SET sal = sal 100 WHERE empno =:eno ' ||  --更新新表的一条记录
                                      'RETURNING sal INTO :sal';                                                --动态SQL语句中包含RETURNING子句返回更新后的结果

                EXECUTE IMMEDIATE sql_stmt                            --执行动态SQL块
                    USING v_empno
                    RETURNING INTO v_new_sal;                          --使用RETURNING子句将结果存放到变量v_new_sal中

                DBMS_OUTPUT.PUT_LINE('New salary is: ' || v_new_sal);
            END;

            The employee count is : 6
            04-JAN-2011
            New salary is: 1050


二、动态SQL的常见错误   

      1.使用动态DDL时,不能使用绑定变量

            下面的示例中,在创建表时使用了绑定变量:dno,在执行的时候收到了错误信息。

            DECLARE
                sql_stmt                VARCHAR2(100);
                v_deptno                VARCHAR2(5) := '30';
                v_count                  NUMBER;
            BEGIN
        <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值