使用SQL函数创建SQL查询时出现Apex分析错误

使用SQL函数创建SQL查询时出现Apex分析错误,sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,我有以下功能: CREATE OR REPLACE FUNCTION calc_a(BIDoctor number) RETURN number IS num_a number; BEGIN select count(NAppoint) into num_a from Appointment a where BIDoctor = a.BIDoctor; RETURN num_a; END calc_a; 我们想要的是在报告中添加一列,显示doc的预约次数 select

我有以下功能:

CREATE OR REPLACE FUNCTION calc_a(BIDoctor number) RETURN number
IS
  num_a number;
BEGIN
  select count(NAppoint)
  into num_a
  from Appointment a
  where BIDoctor = a.BIDoctor;
  RETURN num_a;
END calc_a;
我们想要的是在报告中添加一列,显示doc的预约次数

select a.BIdoctor "NUM_ALUNO",
  a.NameP "Nome",
  a.Address "Local",
  a.Salary "salary",
  a.Phone "phone",
  a.NumberService "Curso",
  c.BIdoctor "bi",
  calc_media(a.BIdoctor) "consultas"
FROM "#OWNER#"."v_Doctor" a, "#OWNER#"."Appointment" c
WHERE a.BIdoctor = c.BIdoctor; 
我们在apex上写区域源时得到了这个。 但它显示了一个解析错误,我找了大约2个小时,什么也没有

Apex向我展示了:

对以下查询的分析错误


这可能是因为你所有的双引号,你似乎已经随机案件的一切。双引号表示您正在使用带引号的标识符,即必须使用该确切名称创建对象/列-
“Hi”
“Hi”
不同。从你的功能判断,去掉所有的双引号-你似乎不需要它们

一般来说,不要使用带引号的标识符。曾经他们制造的麻烦比他们的价值多得多。如果有必要的话,您将知道将来何时要使用它们

SELECT语句还有一些问题

  • 您正在使用隐式联接。SQL-92中添加了显式连接;是时候开始使用它们了——在你未来的职业生涯中,如果没有其他东西,你可能会与其他RDBMS进行交互
  • 绝对不需要你的功能;您可以使用
  • 你的别名有点不可靠-为什么
    a
    指的是医生而
    c
    指的是预约
把所有这些放在一起,你会得到:

select d.bidoctor as num_aluno
     , d.namep as nome
     , d.address as local
     , d.salary as salary
     , d.phone as phone
     , d.numberservice as curso
     , a.bidoctor as bi
     , count(nappoint) over (partition by a.bidoctor) as consultas
  from #owner#.v_doctor a
  join #owner#.appointment c
    on d.bidoctor = a.bidoctor; 
我在猜测
appoint
V_DOCTOR
的主键是什么,但我希望它们分别是
NAPPOINT
BIDOCTOR


顺便说一句,您的函数永远不会返回正确的结果,因为您没有限制查询中参数的范围;您只需计算
约会中的记录数
。当您将参数命名为与表中的列相同的参数时,您必须在编写的任何查询中明确限制参数的作用域,例如:

select count(nappoint) into num_a
  from appointment a
 where calc_a.bidoctor = a.bidoctor; -- HERE

别害羞。编辑您的问题,并包括您得到的错误。calc_a和calc_media是否具有相同的功能?是的,我在这方面有一个错误。更正后出现:无法解析查询,请检查查询的语法。(ORA-00942:表或视图不存在)顺便说一句,我有一个v_医生视图。它无法分析,因为字符无效。我试着选择d.bidoctor作为num_aluno,d.namep作为nome,d.address作为local,d.salary作为salary,d.phone作为phone,d.numberservice作为curso,c.bidoctor作为bi,count(nappoint)over(由c.bidoctor分割)作为来自#owner#的顾问。v#医生d加入#owner#。预约c on d.bidoctor=c.bidoctor;它仍然会给错误提供无效字符