0

現在、apex.oracle.com でアプリを作成しており、これを数時間解決しようとしていますが、方法がわかりません。

基本的に、私のアプリケーションには、アプリケーション内で作成したユーザー テーブルに基づくカスタム認証があります。APEX_UTILしたがって、現在のユーザーに関する情報を取得するためのほとんどの関数は役に立たないようです。問題は、セッション内のテーブルからユーザーの数値 ID を保存する方法を見つけようとしているため、アプリケーション全体のクエリで直接取得してWHERE id = :MEMBER_IDWHERE UPPER(username) = UPPER(:APP_USER).

さて、私がこれを試みた方法は、ユーザー名に基づいてユーザー ID を取得し、APEX_UTIL.SET_SESSION_STATE( p_name => 'MEMBER_ID', p_value => member_id ). ただし、SET_SESSION_STATEカスタム セッション値などを作成できERR-1002ないようで、ドキュメントに具体的に記載されていない値名を使用するたびに を返します。

私は APEX の初心者なので、おそらく何かを認識していませんが、多くの検索を行いましたが、私の問題に特に関連するものは見つかりませんでした。

あなたが助けることができればどうもありがとう.

4

2 に答える 2

2

これを行う方法はいくつかあります。他の回答ですでに提案されているものもあります。

  1. 申請項目(トムの回答による)

  2. PL/SQL パッケージ グローバル(hol の回答による) - ただし、呼び出しごとにリセットする必要があります (たとえば、アプリケーションのセキュリティ属性初期化 PL/SQL コードにコードを追加し、 PL/SQL コードのクリーンアップにコードを追加してクリアします)。 )。

  3. グローバルにアクセス可能なコンテキスト- この方法は少し複雑ですが、特にセキュリティとデバッグにいくつかの利点があります。ここで説明しました: http://jeffkemponoracle.com/2013/02/28/apex-and-application-contexts/ですが、基本的には:

    1. グローバルにアクセス可能なコンテキストを作成します:

      CREATE OR REPLACE CONTEXT MY_CONTEXT USING MY_PACKAGE ACCESSED GLOBALLY;
      
    2. 認証後の手順 (データベース パッケージ内MY_PACKAGE) で、追跡したいデータを保存できます。

      DBMS_SESSION.set_context
        (namespace => 'MY_CONTEXT'
        ,attribute => 'MEMBER_ID'
        ,value     => '12345whatever'
        ,client_id =>  v('APP_USER') || ':' || v('APP_SESSION'));
      

      (私のブログ記事の警告と、CLIENT_IDENTIFIER が認証後の段階で確実に設定されていないことについての他のユーザーからのその後のコメントに注意してください)

    3. ビューやコードなどでは、 を参照するだけで MEMBER_ID にアクセスできますSYS_CONTEXT('MY_CONTEXT','MEMBER_ID')

于 2013-05-20T07:10:26.017 に答える
2

ページ レベルかアプリケーション レベルかを問わず、アイテムに値を格納しようとしています。これには、その名前のアイテムがそれらのスコープのいずれかに存在する必要があります。それで、あなたはどこかに と呼ばれるアイテムを持っていますかMEMBER_ID
アプリケーションスコープで作成することをお勧めします。[共有コンポーネント] > [アプリケーション アイテム] に移動します。apex_util.set_session_state作成したら、バインド変数構文を介して、またはバインド変数構文を使用して値を割り当てることができるはずです。:MEMBER_ID := somevariable;

于 2013-05-19T20:19:52.847 に答える