如何将URL变量传递到APEX报告中?

时间:2015-07-24 09:00:07

标签: oracle-apex

我创建了一个APEX应用程序,需要从URL中获取参数,例如P1_ID - > 'ORCL'。

- (NSURLSession *)backgroundSession
{
    NSString* sessionIdentifier=@"com.liuk.pf";
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];

    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
            session = [NSURLSession sessionWithConfiguration:configuration
                                            delegate:self delegateQueue:nil];
    });
    return session;
}

在页面上我有一个“经典报告(基于功能)”,它应使用此参数。

DB1:8080/apex/f?p=101:1::::P1_ID:ORCL:

当我尝试保存时,它会给我错误:

declare
  l_sql_stmt varchar2(64);
  l_id varchar2(8) := :P1_ID;
begin
  l_sql_stmt = '
    select
      *
    from
      T1@' || l_id;
  return l_sql_stmt;
end;

如何在PL / SQL函数中使用此URL参数?

2 个答案:

答案 0 :(得分:1)

Apex尝试在保存报告时解析语句。它这样做可以生成正确的列并给它们起一个名字 但是,您的查询只能在运行时解析。因此,您应该设置选项"使用通用列名称(仅在运行时解析查询)"低于该地区的来源。然后,Apex将生成具有类似通用名称的通用列(col01,col02,...),并且它们将填充select语句返回的内容。如果您想要动态列名,则必须在报告属性中设置选项,以便通过plsql函数生成它们。
作为旁注,编写select *是一种不好的形式。始终提供实际列列表。如果您尝试制作单个报告,则可以在每个dblink上的每个表上运行查询,我会重新考虑。
如果您的报告包含一组特定的列,并且表T1存在于本地数据库和远程数据库中,您可以简单地创建两个经典报告并有条件地显示它们。这使您可以充分利用顶点。

如果要设置链接到页面的URL并设置项目的会话状态,则需要使用正确的URL语法。您的URL错误,因为您将页面项目名称作为clear cache参数传递,将ORCL作为页面项目名称传递。 Read the documentation on the URL syntax。 此外,您没有传递会话ID。如果您在活动会话中使用此URL,它将启动一个新会话,用户将需要再次登录。您可能希望提供有关定义此URL的方式和位置的一些其他信息。

答案 1 :(得分:0)

PL / SQL程序需要识别参数P1_ID

  • 创建类型为P1_ID
  • 的页面项Hidden
  • 如果需要,为进程中的PL / SQL添加项Item not null的条件P1_ID

<强>更新

PL / SQL中需要注意的事项:

  
      
  1. l_sql_stmt作业
  2.   

l_sql_stmt =应替换为l_sql_stmt :=,否则会抛出PLS-00103: Encountered the symbol "=" when expecting one of the following:

  
      
  1. 您无法从匿名阻止
  2. 返回值   

您拥有的PL / SQL脚本是一个匿名块,您无法从这些块返回值。否则你会遇到PLS-00372: In a procedure, RETURN statement cannot contain an expression错误。

  
      
  1. 创建一个可以将P1_ID值作为参数
  2. 的函数   

您可以创建一个函数,该函数可以将P1_ID的值作为参数并将其传递给外部。

示例:

create or replace function getQueryString (osid varchar2)
return varchar2
is
  l_sql_stmt varchar2(64);
begin
  l_sql_stmt := '
    select
      *
    from
      T1@' ||osid;
  return l_sql_stmt;
end;
/

示例执行:

var P1_ID varchar2(50);
SQL> begin
  2  :P1_ID := 'xyz';
  3  dbms_output.put_line(getQueryString(:P1_ID));
  4  end;
  5  /

    select
      *
    from
      T1@xyz

PL/SQL procedure successfully completed.

另外,请确保P1_ID列在APEX应用程序控制台的Page Items部分。