如何在 Ajax 回调中传递 table 作为参数

How do I pass a table as parameter on Ajax callback

我想在 Oracle APEX 5 中将 table 作为参数传递给 ajax 回调过程,因为我需要对该 table 进行 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: table or view does not exist ORA-06550: line 9, column 5: PL/SQL: SQL Statement ignored

我是个新手。我一直在读到我应该用这个 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?

您需要使用动态 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;
/

这是一个类型为 "Ajax Callback" 的示例页面进程 THIS_PROCESS。请注意,您需要动态 SQL 到 select 来自未硬编码的 table 名称。

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 函数,该函数可以将它喜欢的任何 table 名称传递给您的程序。