使用USING子句执行IMMEDIATE错误
-
06-07-2019 - |
题
所有
我对存储过程一般都很新,但我特别在Oracle中遇到困难。我已经创建了一个非常简单的示例,说明了我要完成的任务,并且我仍然遇到与此简化版本相同的错误。
示例存储过程如下:
CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
DECLARE
v_tab VARCHAR2(50);
v_strSQL VARCHAR2(50);
BEGIN
v_strSQL := 'SELECT * FROM :1';
v_tab := 'ex.emp';
EXECUTE IMMEDIATE v_strSQL USING v_tab;
END;
END;
当我使用 CALL ashish_test()
调用上述存储过程时,我得到:
错误讯息http://web1.twitpic.com/img /12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg
基于这篇文章(查看示例7-1), USING
关键字应该用 v_strSQL
中的编号占位符(:1
)替换存储的值在 v_tab
中。但是,我一直收到无效的表错误。我猜这是因为 EXECUTE IMMEDIATE
由于某种原因无法用值替换占位符,但我不确定为什么会这样。有谁知道我在这里做些蠢事吗?
我在Oracle 10g数据库上运行它&使用PL / SQL Developer。
解决方案
USING子句仅用于绑定变量(即在select语句中使用列名的位置),而不是表名。典型用法如下:
Select col1 from table1 where col2 = :a
如果要使用变量表名,请使用以下内容:
v_tab := 'ex.emp';
v_strSQL := 'SELECT * FROM ' || v_tab;
EXECUTE IMMEDIATE v_strSQL;
不隶属于 StackOverflow