我需要将模式名称作为参数传递给存储过程。但我最终得到错误ORA00942:table or view does not exist
。我google了很多,但没有找到任何解决方案。
实际上,在我们的应用程序中,我们正在一个模式中编写一个存储过程(SP),并为所有其他模式引用相同的SP。
考虑我必须在不同的模式中找到项目的存量(1个模式用于1个客户端)。然后
select * from abc.stock_table where itemid=xxx;
在此查询中,我想用不同的模式名称替换abc
。
答案 0 :(得分:0)
您需要使用动态SQL,因特网上有大量资料。 例如在oracle website
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;
/
答案 1 :(得分:0)
在运行中更改已编译的PLSQL代码中的方案是不可能的。 您应该使用动态SQL。 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm 但是你必须明白这个选项有副作用 - 每次调用动态sql时它都会再次编译。所以它更慢,风险更大。
答案 2 :(得分:0)
从不同的架构为对象创建公共同义词。授予它特权。