Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Ajax回调中传递表作为参数_Javascript_Oracle_Oracle Apex_Oracle Apex 5 - Fatal编程技术网

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

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

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

SQL进程作为共享组件存储在Apex 5应用程序中

我的程序是这样的

(过程名称:本程序)

这段代码(来自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?

您需要使用动态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文档很混乱。谢谢。你让我走上了正确的道路。有奖励。