繁体   English   中英

如何在存储过程中将架构名称作为参数传递

[英]How to pass schema name as parameter in stored procedure

我需要将架构名称作为参数传递给存储过程。 但是我最终遇到错误ORA00942: table or view does not exist 我在Google上搜索了很多,但没有找到任何解决方案。

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

考虑到我必须在不同的模式(1个客户端的1个模式)中找到某项商品的库存。 然后

select * from abc.stock_table where itemid=xxx;

在此查询中,我想用不同的架构名称替换abc

您需要使用Dynamic SQL,Internet上有大量资料。 例如在oracle网站上

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;
/

即时更改已编译的PLSQL代码中的方案是不可能的。 您应该改为使用动态SQL。 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm但是您必须了解此选项有副作用-每次调用动态sql时,它都会再次编译。 因此,它速度较慢,风险更高。

从不同的架构为您的对象创建公共同义词。 授予特权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM