1

我需要将模式名称作为参数传递给存储过程。但我最终得到错误 ORA00942: table or view does not exist。我google了很多,但没有找到任何解决方案。

实际上,在我们的应用程序中,我们正在一个模式中编写存储过程 (SP),并为所有其他模式引用相同的 SP。

考虑一下我必须在不同的模式(1 个客户的 1 个模式)中找到一个项目的库存。然后

select * from abc.stock_table where itemid=xxx;

在此查询中,我想abc用不同的模式名称替换。

4

3 回答 3

0

动态更改已编译的 PLSQL 代码中的方案是不可能的。您应该改用动态 SQL。 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm 但是你必须明白这个选项有副作用——每次你调用动态sql时它都会再次编译。所以它更慢,风险更大。

于 2012-08-24T11:12:53.300 回答
0

从不同的模式为您的对象创建公共同义词。授予它的特权。

于 2012-08-24T11:13:51.877 回答
0

您需要使用动态 SQL,互联网上有大量资料。例如在甲骨文网站上

CREATE OR REPLACE PROCEDURE query_invoice(
       month VARCHAR2, 
       year VARCHAR2) IS
    TYPE cur_typ IS REF CURSOR;
    c cur_typ;
    query_str VARCHAR2(200);
    inv_num NUMBER;
    inv_cust VARCHAR2(20);
    inv_amt NUMBER;
BEGIN
    query_str := 'SELECT num, cust, amt FROM inv_' || month ||'_'|| year 
      || ' WHERE invnum = :id';
    OPEN c FOR query_str USING inv_num;
    LOOP
        FETCH c INTO inv_num, inv_cust, inv_amt;
        EXIT WHEN c%NOTFOUND;
        -- process row here
    END LOOP;
    CLOSE c;
END;
/
于 2012-08-24T11:10:07.560 回答