1

スキーマ名をパラメータとしてストアド プロシージャに渡す必要があります。しかし、エラー ORA00942: が発生しますtable or view does not exist。私はたくさんグーグルで検索しましたが、解決策は見つかりませんでした。

実際、私たちのアプリケーションでは、1 つのスキーマでストアド プロシージャ (SP) を記述し、他のすべてのスキーマに対して同じ SP を参照しています。

別のスキーマ (1 つのクライアントに対して 1 つのスキーマ) でアイテムの在庫を検索する必要があるとします。それで

select * from abc.stock_table where itemid=xxx;

abcこのクエリでは、別のスキーマ名に置き換えたいと考えています。

4

3 に答える 3

0

動的SQLを使用する必要があります。インターネットには大量の資料があります。例:オラクルのWebサイト

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 に答える
0

オブジェクトのパブリック シノニムを別のスキーマから作成します。それに特権を付与します。

于 2012-08-24T11:13:51.877 に答える
0

コンパイルされた PLSQL コードのスキームをオンザフライで変更することはできません。代わりに動的 SQL を使用する必要があります。 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm ただし、このオプションには副作用があることを理解する必要があります-動的SQLを呼び出すたびに、再度コンパイルされます。したがって、それはより遅く、より危険です。

于 2012-08-24T11:12:53.300 に答える