2015-07-24 5 views
-1

Я создал приложение APEX, которое должно принять параметр из URL-адреса, например P1_ID -> 'ORCL.Как передать переменную URL в отчет APEX?

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 
     [email protected]' || l_id; 
    return l_sql_stmt; 
end; 

Когда я пытаюсь сохранить, это дает мне ошибку:

ORA-01008: not all variables bound 

Как я могу использовать этот параметр URL в функции PL/SQL?

ответ

0

Параметр P1_ID должен быть распознан программой PL/SQL.

  • Создать элемент P1_ID страницу с типом как Hidden
  • При необходимости добавить условие Item not null для элемента P1_ID для PL/SQL в процессах

Update:

Набор вещей примечание в вашем PL/SQL:

  1. l_sql_stmt assignment

l_sql_stmt = следует заменить l_sql_stmt :=, в противном случае он будет бросать PLS-00103: Encountered the symbol "=" when expecting one of the following:

  1. You can't return a value from anonymous block

PL/SQL скрипта у вас есть это анонимный блок вы не можете вернуть значение из этих блоков. в противном случае вы ударите ошибку PLS-00372: In a procedure, RETURN statement cannot contain an expression.

  1. Create a function which can take value of P1_ID as argument

Вы можете создать функцию, которая может принимать значение P1_ID в качестве аргумента и передать его извне.

Пример:

create or replace function getQueryString (osid varchar2) 
return varchar2 
is 
    l_sql_stmt varchar2(64); 
begin 
    l_sql_stmt := ' 
    select 
     * 
    from 
     [email protected]' ||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 
     [email protected] 

PL/SQL procedure successfully completed. 

Кроме того, убедитесь, что P1_ID указан в Page Items разделе консоли приложения APEX.

+0

Спасибо за длительное объяснение. Я пропустил «: =», просто упростив пример. Кроме того, отчет, кажется, генерируется красиво (когда я говорю явно «l_id varchar2 (8): =« ORCL »;) даже с анонимным блоком. Я все еще сталкиваюсь с первоначальной проблемой, назначая переменную. Теперь я использую в источнике отчета 'return TESTFUNCTION (: P1_ID)', но я все равно получаю не связанную ошибку. В разделе «Страница 2 - Регионы - Тело контента - Отчет - Элементы» отображается P1_ID как «Скрытый». – Geo

+0

Я не думаю, что проблема заключается в самом отчете/запросе, но в моем отсутствии знаний о том, как переносить переменную из URL-адреса и делать с ней что-либо (например, отображать его в поле «Текст») – Geo

1

Apex пытается проанализировать заявление при сохранении отчета. Он делает это, чтобы он мог генерировать правильные столбцы и давать им имя.
Однако ваш запрос может быть проанализирован только во время выполнения. Поэтому вы должны установить опцию «Использовать общие имена столбцов (только в режиме исполнения)» ниже источника области. Затем Apex будет генерировать общие столбцы (col01, col02, ...) с похожими именами общего типа, и они будут заполнены тем, что возвращает оператор select. Если вам нужны динамические имена столбцов, вам нужно будет установить параметр в атрибутах отчета, чтобы сгенерировать их через функцию plsql.
В качестве побочного эффекта, это плохая форма для написания select *. Всегда указывайте фактический список столбцов. И если вы пытаетесь сделать один отчет в состоянии выполнить запрос в каждой таблице на каждом dblink, я бы пересмотрел.
Если ваш отчет содержит определенный набор столбцов, а таблица T1 существует на вашем локальном db и удаленном db, вы также можете просто создать два классических отчета и отобразить их условно. Это позволяет использовать вершину в полной мере.

Если вы хотите настроить URL-адрес для ссылки на страницу и установить состояние сеанса элемента, вам нужно использовать правильный синтаксис URL-адреса. Ваш URL-адрес неверен, поскольку вы передаете имя элемента страницы в качестве четкого параметра кеша и ORCL в качестве имени страницы. Read the documentation on the URL syntax. Кроме того, вы не передаете идентификатор сеанса. Если вы используете этот URL-адрес в активном сеансе, он начнет новый сеанс, и пользователю потребуется снова войти в систему. Вы можете указать дополнительную информацию о том, как и где вы определяете этот URL.

+0

«select * 'был примером, так как я использую четко определенные имена столбцов в select. Моя проблема заключается в использовании переменной в инструкции. – Geo

+0

@ Geo нормально, а как же остальная часть моего сообщения? Насколько я понимаю, вы не можете сохранить отчет с источником, который вы описываете. Это нормально, потому что не существует состояния сеанса для элемента «P1_ID», когда вы сохраняете отчет, а вершина пытается разобрать инструкцию для сбора метаданных. Вот почему вы получаете описанную вами ошибку. – Tom

+0

Спасибо, я проверил и изменил столбцы, как вы указали. Теперь, по крайней мере, я могу сохранить приложение. Однако проблема с привязкой к переменным все еще существует. – Geo

Смежные вопросы