简体   繁体   English

Oracle APEX 20.1 图表错误,“PL/SQL Function 正文返回 SQL 查询”

[英]Oracle APEX 20.1 Charts Error with “PL/SQL Function Body returning SQL Query”

I have a problem with new charts in Oracle APEX 20.1.我对 Oracle APEX 20.1 中的新图表有疑问。

I need to do chart from PL/SQL Function Body returning SQL Query, but it only works if I do it with some exact parameters.我需要从 PL/SQL Function Body 返回 SQL 查询做图表,但它只有在我使用一些确切的参数时才有效。 All variables return from the same submitted page.所有变量都从同一个提交的页面返回。

If I use all variables as parameter then i get error:如果我使用所有变量作为参数,那么我会得到错误:
ORA-20999: PL/SQL function body did not return a value. ORA-20999:PL/SQL function 主体未返回值。

If I use variable:P2_OBJECT and parameter for:P2_YEAR and:P2_ANNUAL_TIME then i get error:如果我使用变量:P2_OBJECT 和参数:P2_YEAR 和:P2_ANNUAL_TIME 那么我得到错误:
ORA-20999: PL/SQL function body did not return a value. ORA-20999:PL/SQL function 主体未返回值。

If I use variable:P2_YEAR and parameter for:P2_OBJECT and:P2_ANNUAL_TIME then i get error:如果我使用变量:P2_YEAR 和参数:P2_OBJECT 和:P2_ANNUAL_TIME 那么我得到错误:
ORA-20999: Parsing returned query results in "ORA-20999: Failed to parse SQL query: ORA-06550, line 2: column 402: ORA-00936. missing expression". ORA-20999:解析返回的查询结果为“ORA-20999:无法解析 SQL 查询:ORA-06550,第 2 行:第 402 列:ORA-00936。缺少表达式”。

If I use variable:P2_ANNUAL_TIME and parameter for:P2_OBJECT and:P2_YEAR then i get error:如果我使用变量:P2_ANNUAL_TIME 和参数:P2_OBJECT 和:P2_YEAR 那么我得到错误:
ORA-20999: Parsing returned query results in "ORA-20999: Failed to parse SQL query: ORA-06550, line 2: column 113: ORA-01741. illegal zero-length identifier". ORA-20999:解析返回的查询结果为“ORA-20999:无法解析 SQL 查询:ORA-06550,第 2 行:第 113 列:ORA-01741。非法零长度标识符”。

but in a classic report the same function with variables works just fine...但在经典报告中,带有变量的相同 function 工作得很好......

this source for chart works:此图表来源有效:

declare l_sql varchar2(2000) ;
begin
select F_CHARTS(4020 , 2018 ,'TIM_MM',
:P2_LEVELS, :P2_SUB_LEVELS, :P2_SQL_CONDITION, :P2_WAREHOUSE, :P2_UNIT_OF_MEASURE)
into l_sql from dual;
return l_sql ; 
end ;

but this does not:但这不会:

declare 
l_sql varchar2(2000) ;
begin
select F_CHARTS(:P2_OBJECT,:P2_YEAR,:P2_ANNUAL_TIME,
:P2_LEVELS, :P2_SUB_LEVELS, :P2_SQL_CONDITION, :P2_WAREHOUSE, :P2_UNIT_OF_MEASURE)
into l_sql from dual;
return l_sql ; 
end ;

This is the function:这是 function:

create or replace FUNCTION F_CHARTS(
cod in NUMBER,      
year in NUMBER,         
t_time in varchar2,         
v_dims in varchar2,     
p_subl in varchar2,             
cod_filter in NUMBER,       
w_warehouse in varchar2,    
amount in NUMBER)        

return varchar2 is s varchar2(4000);

g2 boolean := false;
l NUMBER := 0; 
m VARCHAR2(1000) :='';
c VARCHAR2(40) :='';
w VARCHAR2(40) :='';
sql_cond VARCHAR2(4000) :='';
ope VARCHAR2(5) :='';

OGG_FACT_TAB VARCHAR2(40); 
OGG_COL_GROUP VARCHAR2(40); 
OGG_COL_SUBGR VARCHAR2(40); 
OGG_COL_SUM VARCHAR2(200); 
OGG_COL_TIME VARCHAR2(40); 
OGG_ALIAS_SUM VARCHAR2(100);
OGG_DIMS_TAB VARCHAR2(40); 
OGG_COL_KEY VARCHAR2(40); 
OGG_COL_DES VARCHAR2(40); 
OGG_ALIAS_TAB VARCHAR2(100); 
OGG_AVERAGES VARCHAR2(1);
OGG_CLASS NUMBER;
OGG_COL_SUM2 VARCHAR2(200); 

cursor times is SELECT QTM_DESCRIPTION,QTM_DES_VALUE,QTM_VALUE FROM Q_TIME WHERE QTM_FIELD_NAME=t_time ORDER BY QTM_SEQUENCE; 

BEGIN

select OGG_CLASS,OGG_FACT_TAB,OGG_COL_GROUP,OGG_COL_SUM,OGG_COL_TIME,OGG_ALIAS_SUM,OGG_DIMS_TAB,OGG_COL_KEY,OGG_COL_DES,OGG_ALIAS_TAB,OGG_COL_SUBGR,TRIM(OGG_AVERAGE),TRIM(OGG_COL_SUM2) into OGG_CLASS,OGG_FACT_TAB,OGG_COL_GROUP,OGG_COL_SUM,OGG_COL_TIME,OGG_ALIAS_SUM,OGG_DIMS_TAB,OGG_COL_KEY,OGG_COL_DES,OGG_ALIAS_TAB,OGG_COL_SUBGR,OGG_AVERAGES,OGG_COL_SUM2 from Q_OBJECT where OGG_CODE = cod;

IF ( p_subl is not null and p_subl <> 'null' and TRIM(p_subl) is not null and p_subl <> to_char(cod)
and OGG_COL_SUBGR IS not NULL and TRIM(OGG_COL_SUBGR) is not null ) THEN      
  g2:=true;
  IF ( OGG_CLASS = 1 AND amount = 1 AND OGG_COL_SUM2 IS NOT NULL ) THEN
    OGG_COL_SUBGR:='''kg''';    
    OGG_COL_SUM:=OGG_COL_SUM2;
  ELSE
    OGG_COL_SUBGR:='f.'||OGG_COL_SUBGR; 
  END IF;
END IF;

IF (OGG_AVERAGES is not null and OGG_AVERAGES='S') THEN
  ope:='avg'; 
ELSE
  ope:='sum';
END IF;

m:=t_time;
FOR reco IN times LOOP
  c:=reco.QTM_DESCRIPTION;
  m:=m||','||to_char(reco.QTM_VALUE)||','''||reco.QTM_DES_VALUE||'''';
END LOOP; 
m:=m||',''...'')';

s:='select null link, mm "'||c||'", ii "'||OGG_ALIAS_SUM||' '||to_char(year)||'" from ('; 
s:=s||'select '||t_time||' tt, decode(t.'||m||' mm';
s:=s||', trunc('||ope||' ('||OGG_COL_SUM||'))'||' ii';
s:=s||' from D_TIME t, '||OGG_FACT_TAB||' f';
s:=s||' where t.TIM_AAAA = '||year;
s:=s||' and f.'||OGG_COL_TIME||' = t.TIM_KEY';

IF (g2) THEN
  s:=s||' and  '||OGG_COL_SUBGR||' = '''||p_subl||'''';
END IF;

IF (OGG_FACT_TAB='R_MAG_SALES' and w_warehouse is not null and w_warehouse <> 'null') THEN 
  s:=s||' and f.MS_WAREHOUSE = '''||w_warehouse||'''';
END IF; 

IF (v_dims is not null and v_dims <> 'null') THEN 
  s:=s||' and f.'||OGG_COL_GROUP||' = '''||v_dims||'''';
END IF; 


BEGIN
  SELECT NVL(TRIM(SQL_CONDITION),'.') INTO sql_cond FROM Q_SQL_CONDITION WHERE SQL_CODE=cod_filter;
EXCEPTION
WHEN NO_DATA_FOUND THEN
  sql_cond:='.';    
END;

IF (sql_cond<>'.') THEN
  s:=s||' and ('||sql_cond||')';
END IF;

s:=s||' group by t.'||t_time;
s:=s||' union ';
s:=s||'select t2.'||t_time||', decode(t2.'||m||', 0 from D_TIME t2';
s:=s||' where t2.'||t_time||' <> 0 and t2.'||t_time||' not in';
s:=s||' (select unique t3.'||t_time||' from D_TIME t3,'||OGG_FACT_TAB||' f3';
s:=s||'  where t3.TIM_AAAA = '||year;
s:=s||'  and t3.TIM_KEY = f3.'||OGG_COL_TIME;

BEGIN
  SELECT NVL(TRIM(SQL_CONDITION),'.') INTO sql_cond FROM Q_SQL_CONDITION WHERE SQL_CODE=cod_filter;
EXCEPTION
WHEN NO_DATA_FOUND THEN
  sql_cond:='.';    
END;
IF (sql_cond<>'.') THEN
  s:=s||' and ('||sql_cond||')';
END IF;

IF (OGG_FACT_TAB='R_MAG_SALES' and w_warehouse is not null and w_warehouse <> 'null') THEN 
  s:=s||' and f3.MS_WAREHOUSE = '''||w_warehouse||'''';
END IF; 

IF (v_dims is not null and v_dims <> 'null') THEN 
  s:=s||'  and f3.'||OGG_COL_GROUP||' = '''||v_dims||''')';
ELSE
  s:=s||')';    
END IF; 

s:=s||' group by t2.'||t_time;
s:=s||')';
s:=s||' order by tt';

RETURN (s);

END;

To better understand this is the result of the function:为了更好地理解这是 function 的结果:

select null link, mm "Month", ii "  2018" from 
  (select TIM_MM tt, decode(t.TIM_MM,1,'January',2,'February',3,'March',4,'April',5,'May',6,'June',7,'July',8,'August',9,'September',10,'October',11,'November',12,'December','...') mm, trunc(sum (MS_FINAL_EXISTENCE)) ii from 
    D_TIME t, R_MAG_SALES f 
    where t.TIM_AAAA = 2018 and f.MS_TIM_BALANCE_DATE = t.TIM_KEY and  f.MS_UNIT_OF_MEASURE = 'PZ' and f.MS_COD_CATEGORY = '000001' group by t.TIM_MM 
  union select t2.TIM_MM, decode(t2.TIM_MM,1,'January',2,'February',3,'March',4,'April',5,'May',6,'June',7,'July',8,'August',9,'September',10,'October',11,'November',12,'December','...'), 0 from 
    D_TIME t2 
    where t2.TIM_MM <> 0 
    and t2.TIM_MM not in (select unique t3.TIM_MM from D_TIME t3,R_MAG_SALES f3  where t3.TIM_AAAA = 2018  and t3.TIM_KEY = f3.MS_TIM_BALANCE_DATE  and f3.MS_COD_CATEGORY = '000001') group by t2.TIM_MM) order by tt

Can enybody please help me, I just do not see what is wrong...任何人都可以帮助我,我只是看不出有什么问题......

When you write the query in IR/CR, the bind variables:P2_OBJECT,:P2_YEAR are null.当您在 IR/CR 中编写查询时,绑定变量:P2_OBJECT,:P2_YEAR 为 null。 So, your builder assumes the query as select F_CHARTS(NULL,NULL,....) into l_sql from dual;因此,您的构建器假定查询为 select F_CHARTS(NULL,NULL,....) 从 dual 进入 l_sql; So the compilation of PLSQL block fails所以 PLSQL 块的编译失败

You can write the query as select f_charts ( COALESCE(:P2_OBJECT, 'X'), COALESCE(:P2_YEAR, 0)....) from dual.您可以从 dual 将查询编写为 select f_charts ( COALESCE(:P2_OBJECT, 'X'), COALESCE(:P2_YEAR, 0)....)。

SO, you are actually sending some actual values to f_charts You can also handle this in function to assume some value if inputs are null.所以,你实际上是在向 f_charts 发送一些实际值如果输入是 null,你也可以在 function 中处理这个假设一些值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM