Javascript 如何在Ajax回调中传递表作为参数
我想在OracleApex 5中的ajax回调过程中传递一个表作为参数,因为我需要对该表进行SQL查询 SQL进程作为共享组件存储在Apex 5应用程序中 我的程序是这样的 (过程名称:本程序) 这段代码(来自v_tablename)给了我一个编译错误: ORA-00942:表或视图不存在ORA-06550:第9行第5列: PL/SQL:SQL语句被忽略 我完全是个新手。我一直在读,我应该用以下javascript调用该过程:Javascript 如何在Ajax回调中传递表作为参数,javascript,oracle,oracle-apex,oracle-apex-5,Javascript,Oracle,Oracle Apex,Oracle Apex 5,我想在OracleApex 5中的ajax回调过程中传递一个表作为参数,因为我需要对该表进行SQL查询 SQL进程作为共享组件存储在Apex 5应用程序中 我的程序是这样的 (过程名称:本程序) 这段代码(来自v_tablename)给了我一个编译错误: ORA-00942:表或视图不存在ORA-06550:第9行第5列: PL/SQL:SQL语句被忽略 我完全是个新手。我一直在读,我应该用以下javascript调用该过程: apex.server.process ( "THIS_PROCES
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;
/
您需要使用动态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回调”类型的页面进程示例。请注意,您需要使用动态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函数,该函数可以将它喜欢的任何表名传递给您的过程 下面是一个“Ajax回调”类型的页面进程示例。请注意,您需要使用动态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函数,该函数可以将它喜欢的任何表名传递给您的过程 是否确实连接到了真正的架构?ORA-00942可能由此引起。i、 e.可能您的
v_tablename
位于另一个模式。@BarbarosÖzhan SQL进程作为共享组件存储在Apex 5应用程序中。我还需要做什么吗?对不起,我对apex一无所知,但对于oracle连接,我可以发表评论。您确定要连接到真正的架构吗?ORA-00942可能由此引起。i、 e.可能您的v_tablename
位于另一个模式。@BarbarosÖzhan SQL进程作为共享组件存储在Apex 5应用程序中。我还需要做什么吗?对不起,我对apex一无所知,但对于oracle连接,我可以在那里发表评论。我不明白。这个进程已经在“Point”中设置为Ajax回调。我无法在那里编写“创建或替换过程”,因为它会引发编译错误。我认为我应该做两个进程,但为什么我不能使用一个进程,并编写v_table:=apex_application.g_x01Oh,你可以!我错了,我误解了你的问题。我将编辑我的答案。谢谢!。我花了一个星期的时间在谷歌上搜索,但毫无头绪。奖励使用动态SQL时要小心,不要使用DBMS_ASSERT来验证表名,您可以进行SQL注入,我不明白。这个进程已经在“Point”中设置为Ajax回调。我无法在那里编写“创建或替换过程”,因为它会引发编译错误。我认为我应该做两个进程,但为什么我不能使用一个进程,并编写v_table:=apex_application.g_x01Oh,你可以!我错了,我误解了你的问题。我将编辑我的答案。谢谢!。我花了一个星期的时间在谷歌上搜索,但毫无头绪。使用动态SQL而不使用DBMS_ASSERT来验证表名,您是否已打开SQL注入x01自动存储在v_tablename中?或者我应该添加代码v_tablename:=apex_application.g_x01 Oracle文档很混乱。谢谢。你让我走上了正确的道路。有奖励。x01是否自动存储在v_tablename中?或者我应该添加代码v_tablename:=apex_application.g_x01 Oracle文档很混乱。谢谢。你让我走上了正确的道路。有奖励。