如何在 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 名称传递给您的程序。
我想在 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 名称传递给您的程序。