2017-10-25 15 views
0

Oracle APEX 5のajaxコールバックプロシージャで、そのテーブルに対してSQLクエリを作成する必要があるため、パラメータとしてテーブルを渡したいとします。Ajaxコールバックでパラメータとしてテーブルを渡す方法

SQLプロセスは、共有コンポーネントとしてApex 5アプリケーション内に保存されます。 Screenshot

私の手順は、この

(プロシージャ名:THIS_PROCESS)のようなものです

declare 
    v_tablename varchar(128);--max table_name lenght 
    v_ID number; 

    v_somevar 
BEGIN 
    SELECT Columname, 
    INTO v_somevar 
    FROM v_tablename 
    WHERE ID = v_ID; 

     --Do stuff   
END; 

(v_tablename FROM)このコードは私のコンパイルエラー与える:私は

ORA-00942: table or view does not exist ORA-06550: line 9, column 5: PL/SQL: SQL Statement ignored

を総初心者。私はこのJavaScriptでそのプロシージャを呼び出す必要があることを読んでいた:私は代わりにv_tablenameのX01とX02を渡す必要とv_ID

が自動的X01とX02を行い、なぜ私は理解していない

apex.server.process ("THIS_PROCESS", { 
     x01: "TABLENAME", 
     x02: "Row_ID", 

     pageItems: "#P1_Item,#P2_Item" 
    },{ 
     success: function(pData) 
      // do something here 
     } 
    }); 

はv_tablenameに割り当てられていますv_ID?動的SQLを使用する必要が

+0

本当のスキーマに接続してもよろしいですか? ORA-00942が原因です。つまり、おそらくあなたの 'v_tablename'は別のスキーマにあります。 –

+0

@BarbarosÖzhanSQLプロセスは、共有コンポーネントとしてApex 5アプリケーション内に格納されます。私は何か他のことをする必要がありますか? https://i.imgur.com/d5xqkzo.png – bewe

+0

申し訳ありませんが私は頂点については何も知らないが、私はコメントすることができますOracle接続のために、そこに。 –

答えて

1

ここでタイプ "Ajaxのコールバック" の例のページプロセスTHIS_PROCESSです。ハードコードされていないテーブル名から選択するには、動的SQLが必要です。この設計は、悪意のあるユーザーが、それはあなたの手順に好きな任意のテーブル名を渡すことができ、独自のJavaScript関数を記述することができます -

declare 
    v_table varchar2(128) := apex_application.g_x01; 
    v_id number := apex_application.g_x02; 
    v_somevar varchar2(100); 
    v_sql varchar2(4000); 
begin 
    -- validate v_table parameter to avoid sql injection. will throw exception if it fails 
    select table_name into v_table from all_tables where table_name = v_table; 

    v_sql := 'SELECT Columname 
    FROM ' || v_table || ' 
    WHERE ID = :A1'; 
    execute immediate v_sql into v_somevar using v_id; 
    -- do something with v_somevar 
end; 

は、この種のものには注意してくださいますか。

+0

私は分かりません。 THIS_PROCESSはすでにAjaxコールバックとして "Point"に設定されています。コンパイルエラーが発生するため、「プロシージャの作成または置換」を記述することはできません。私は2つのプロセスを作成する必要がありますが、なぜ1つを使用できないのか、v_table:= apex_application.g_x01を書きます。 – bewe

+0

ああ、できます!私の間違い、私はあなたの質問を誤解しました。私は私の答えを編集します。 – kfinity

+0

ありがとうございました!私は週にそれをグーグルで過ごし、何の手がかりも持っていませんでした。報酬をお持ちくださいhttps://www.youtube.com/watch?v=7p20NhyztxU – bewe

1

declare 
    v_tablename varchar(128);--max table_name lenght 
    v_sql varchar2(1000); 
    v_ID number; 
    v_somevar varchar2(100); 
BEGIN 
    v_sql := 'SELECT Columname FROM ' || v_tablename || ' where ID = :1'; 
    EXECUTE IMMEDIATE v_sql INTO v_somevar USING v_ID; 

     --Do stuff   
END; 
/
+0

x01は自動的にv_tablename内に保存されますか? v_tablename:= apex_application.g_x01というコードを追加する必要がありますか?Oracleドキュメントは混乱します。 – bewe

+0

ありがとうございます。あなたは私を正しい軌道に乗せる。報酬をください。 https://www.youtube.com/watch?v=PjfpW4A4wtM – bewe

関連する問題