0

可能重复:
UPSERT 到具有动态表名的表中

以下过程被声明为:

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 语句中的有效表名?假设我提前不知道表名。

更新

该函数现在可以编译,但是我目前在函数末尾收到未知关键字错误。

4

1 回答 1

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;

应该为您解决问题。

注意不要在参数tableToQuery中传递来自最终用户(尤其是 Web 上的用户)的未经验证的数据,否则您将遇到 SQL 注入漏洞!

于 2012-07-24T14:35:04.327 回答