2012-07-24 58 views
0
变量

可能重复:
UPSERT into table with dynamic table name甲骨文合并语句中的程序无法识别使用条款

下面的过程声明为这样:

CREATE OR REPLACE 
PROCEDURE STUFF(tableToQuery VARCHAR2) AS 
BEGIN 
    MERGE INTO myTable m 
    USING (select * from tableToQuery) t 
    ON (m.id = t.id) 
... --other stuff 
END STUFF; 

我收到表明表名称无效的ORA-00903错误。我的问题是如何获取tableToQuery中的值等同于select语句中的有效表名?假设我不提前知道表名。

UPDATE

功能汇编现在,但是我目前收到未知的关键字错误在我的函数结束。

+0

“未知关键字”表示语法错误。唉,我们不是心灵感应。所以我们不能在你没有发布的代码中发现语法错误。如果您使用动态SQL解决方案,则需要发布您的过程生成的SQL语句。 – APC 2012-07-25 11:06:06

回答

3

您需要使用动态SQL:即在一个字符串中构造您的SQL语句,然后将该字符串传递给Oracle以使用execute immediate语句执行。

喜欢的东西

CREATE OR REPLACE 
PROCEDURE STUFF(tableToQuery IN VARCHAR2) AS 
    s varchar2(100); 
BEGIN 
    s := 'MERGE INTO myTable m' 
    || ' USING (select * from ' || tableToQuery || ') t' 
    || ' ON (m.id = t.id)'; 
    EXECUTE IMMEDIATE s; 
    --other stuff 
END STUFF; 

应该做的伎俩为您服务。

NB不会传递参数tableToQuery中最终用户(尤其是网络上的用户)的未经验证的数据,因为那样您将会遇到SQL注入漏洞!

+0

正确的SQL注入:) – Woot4Moo 2012-07-24 14:37:20

+0

似乎要做的伎俩,将保持张贴 – Woot4Moo 2012-07-24 14:53:57

+0

我总是在动态SQL中引用Oracle标识符, ... from“'|| tableToQuery ||'”... ... 在Oracle中任何有效的表名(即使使用混合大小写或空格等)也可以在我的动态代码中工作。 – 2012-07-24 14:56:03