2、不能使用schema对象作为绑定参数

  下面的示例中,动态SQL语句查询需要传递表名,因此收到了错误提示。

DECLARE
         sql_stmt VARCHAR2(100);
         v_count  NUMBER;
       BEGIN
         EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM :tb_name'
           INTO v_count;
         DBMS_OUTPUT.PUT_LINE('The table record  is  ' || v_count);
       END;
 
       DECLARE
       *
       ERROR at line 1:
       ORA-00903: invalid table name
       ORA-06512: at line 5

  处理办法

DECLARE
             sql_stmt VARCHAR2(100);
             v_tablename VARCHAR2(30) :='scott.emp';   --增加一个变量并赋值
             v_count  NUMBER;
           BEGIN
             EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_tablename   --使用|| 连接变量
              INTO v_count;
             DBMS_OUTPUT.PUT_LINE('The table record is  ' || v_count);
           END;
        
           The temp table count is  14

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

  下面的示例中,动态SQL语句使用了分号来结束,收到错误提示。

DECLARE
         sql_stmt VARCHAR2(100);
         --v_tablename VARCHAR2(30) :='scott.emp';
         v_count  NUMBER;
       BEGIN
         EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM tb_emp;'   --此处多出了分号,应该去掉
           INTO v_count;
         DBMS_OUTPUT.PUT_LINE('The temp table count is  ' || v_count);
       END;
 
       DECLARE
       *
       ERROR at line 1:
       ORA-00911: invalid character
       ORA-06512: at line 6

  处理办法

  去掉动态SQL语句末尾的分号

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

DECLARE
         plsql_block VARCHAR2(300);
       BEGIN
         plsql_block := 'DECLARE ' ||
                      ' v_date DATE; ' ||
                      ' BEGIN ' ||
                        ' SELECT SYSDATE INTO v_date FROM DUAL; ' ||
                        ' DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_date,''YYYY-MM-DD''));' ||
                      'END;
                        /';   --此处多出了/,应该将其去掉
         EXECUTE IMMEDIATE plsql_block;
       END;
        
       DECLARE
       *
       ERROR at line 1:
       ORA-06550: line 3, column 2:
       PLS-00103: Encountered the symbol "/" The symbol "/" was ignored.
       ORA-06512: at line 13

  处理办法

  去掉动态PL/SQL 块尾部的斜杠