我想在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?
答案 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函数,该函数可以将任何它喜欢的表名传递给您的程序。