我有一个简单的 select 语句,它使用一个(不是那么)简单的函数。为了这个问题的目的,我将尽力简化和展示我的能力。
select submission_identifier,
submitted_by_person_id,
submission_date,
form_version_date_time,
form_id,
func_get_open_days_2(
submitted_by_person_id,
submission_date,
form_version_date_time,
form_id)` open_days
from form_submission
where submission_identifier = 2070;
submission_identifier 是 form_submission 表的主键,因此自然地,此查询返回一个结果。
如您所见,该函数有 4 个参数。我假设这些参数中的值是计算 where 子句后的查询结果。这是该函数的一个片段。
create or replace function func_get_Open_Days_2
( SUBMITTED_BY_PERSON_ID in number,
SUBMISSION_DATE in date,
FORM_VERSION_DATE_TIME in timestamp,
FORM_ID in number
)
RETURN number
IS
n1 number:=0;
n2 number:=0;
cursor records is
SELECT
SUBMITTED_BY_PERSON_ID,
SUBMISSION_DATE,
FORM_ID,
FORM_VERSION_DATE_TIME,
AUDIT_DATE_TIME,
STATUS_DATE,
SUBMISSION_STATUS_CODE,
CREATE_USER_ID
from form_state_audit_trail t
where
t.submitted_by_person_id = SUBMITTED_BY_PERSON_ID and
t.form_id = FORM_ID and
t.submission_date = SUBMISSION_DATE and
t.form_version_date_time = FORM_VERSION_DATE_TIME and
t.submission_status_code NOT IN (3469, 3462);
order by t.status_date asc;
rec records%ROWTYPE;
BEGIN
dbms_output.put_line('submitted by person id ='||submitted_by_person_id);
dbms_output.put_line('form id ='||form_id);
dbms_output.put_line('submission date ='||submission_date);
dbms_output.put_line('form_version_date_time ='||form_version_date_time);
-- go through all the durations in audit_trail table
FOR rec in records
LOOP
我已经尝试对返回值进行硬编码并将它们放入此游标选择查询中。我收到 1 个结果。
这向我建议“记录”数组或列表应该只有 1 个结果。但是,我现在得到了很多结果。正在返回“记录”,这表明没有使用我期望的 4 个值/结果评估 where 子句我不确定我做错了什么。“dbms_output.put_line”是 BEGIN,但在 LOOP 确认预期值到达函数之前。
函数
WHERE
子句中的引用与其子句中的同名列进行比较SELECT
,而不是参数列表。尝试按如下方式更改它(注意ARG_
在子句中的参数名称和谓词中添加了WHERE
):