如何在Ajax回调上传递表作为参数

时间:2017-10-25 12:58:00

标签: javascript oracle oracle-apex oracle-apex-5

我想在Oracle APEX 5中的ajax回调过程中传递一个表作为参数,因为我需要在该表上进行SQL查询。

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;

此代码(FROM v_tablename)给出了编译错误:

  

ORA-00942:表或视图不存在ORA-06550:第9行第5列:   PL / SQL:忽略SQL语句

我是个新手。我一直在读,我应该用这个javascript调用该程序:

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

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

我不明白为什么我应该传递x01和x02而不是v_tablename和v_ID

是否自动将x01和x02分配给v_tablename和v_ID?

2 个答案:

答案 0 :(得分:1)

您需要使用动态sql:

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

答案 1 :(得分:1)

这是" Ajax Callback"类型的示例页面进程THIS_PROCESS。请注意,您需要动态SQL从不硬编码的表名中进行选择。

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;

请注意这类事情 - 这种设计将允许恶意用户编写自己的javascript函数,该函数可以将任何它喜欢的表名传递给您的程序。