动态SQL的常见错误
作者:网络转载 发布时间:[ 2013/4/17 9:57:26 ] 推荐标签:
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 块尾部的斜杠

sales@spasvo.com