While debugging, I came across a strange situation today with a query that has a join condition on a column that could be NULL.
I have data in two tables like this:
emp_payment_trans_tab:
emp_payment_tab:
When I execute this statement, I get no result:
SELECT emp_no, payment_date, expense_id, a.company_id
FROM emp_payment_trans_tab a, emp_payment_tab b
WHERE a.emp_pay_trans_id = '201906'
AND a.payment_id = b.payment_id
AND a.emp_payment_status != 'C';
I have written a procedure where this query is run using a cursor. In the real scenario, emp_pay_trans_id
will be a variable passed on to the procedure as a parameter. But for testing I just add the same value I used in the above query.
As you can see, I added a trace line to see if the values are getting printed correctly as well.
PROCEDURE Create_Header__ (
emp_pay_trans_id_ IN NUMBER )
IS
emp_no_ VARCHAR2(11);
pay_date_ DATE;
expense_id_ NUMBER;
company_id_ VARCHAR2(20);
CURSOR get_emp_details IS
SELECT emp_no, payment_date, expense_id, a.company_id
FROM emp_payment_trans_tab a, emp_payment_tab b
WHERE emp_pay_trans_id = '201906' -- emp_pay_trans_id_ will be used here in the real scenario
AND a.payment_id = b.payment_id
AND a.emp_payment_status != 'C';
BEGIN
OPEN get_emp_details;
FETCH get_emp_details INTO emp_no_, pay_date_, expense_id_, company_id_;
CLOSE get_emp_details;
-- commenting this as I won't share the trace procedure because the question will by lengthy if I add everything. You can use a dbms output line instead.
-- Autonomous_Trace_dinllk('values passed0', 'emp_no_: ' || emp_no_ || ', company_id_: ' || company_id_ || ', pay_date_: ' || pay_date_ || ', expense_id_: ' || expense_id_ );
END Create_Header__;
For the trace line, I'm getting all the values printed. I'm confused. Can someone explain the reason for this different behavior? If there are no rows when the same query is executed independently, why does the cursor fetch values?
I'm using Oracle 12c (Enterprise Edition Release 12.2.0.1.0 if it helps).
Edit: Adding queries and code for reference:
create table EMP_PAYMENT_TRANS_TAB
(
emp_pay_trans_id NUMBER not null,
emp_payment_status VARCHAR2(20) not null,
company_id VARCHAR2(20) not null,
expense_id NUMBER,
emp_no VARCHAR2(11) not null,
payment_id NUMBER,
constraint EMP_PAYMENT_TRANS_PK primary key (EMP_PAY_TRANS_ID)
)
insert into emp_payment_trans_tab (COMPANY_ID, EMP_PAY_TRANS_ID, EMP_NO, EMP_PAYMENT_STATUS, EXPENSE_ID, PAYMENT_ID)
values ('10', 201906, '1002', 'A', 203184, null);
insert into emp_payment_trans_tab (COMPANY_ID, EMP_PAY_TRANS_ID, EMP_NO, EMP_PAYMENT_STATUS, EXPENSE_ID, PAYMENT_ID)
values ('10', 201960, '10100', 'T', 202795, 201314);
insert into emp_payment_trans_tab (COMPANY_ID, EMP_PAY_TRANS_ID, EMP_NO, EMP_PAYMENT_STATUS, EXPENSE_ID, PAYMENT_ID)
values ('10', 201962, '10113', 'T', 203089, 201314);
create table EMP_PAYMENT_TAB
(
payment_id NUMBER not null,
payment_date DATE,
company_id VARCHAR2(20),
method_id VARCHAR2(25),
constraint EMP_PAYMENT_PK primary key (PAYMENT_ID)
)
insert into emp_payment_tab (COMPANY_ID, PAYMENT_ID, PAYMENT_DATE, METHOD_ID)
values ('10', 201314, to_date('25-11-2020', 'dd-mm-yyyy'), 'BACS');
insert into emp_payment_tab (COMPANY_ID, PAYMENT_ID, PAYMENT_DATE, METHOD_ID)
values ('10', 202011, to_date('01-07-2021', 'dd-mm-yyyy'), 'BANK2');
insert into emp_payment_tab (COMPANY_ID, PAYMENT_ID, PAYMENT_DATE, METHOD_ID)
values ('10', 202151, to_date('01-11-2021', 'dd-mm-yyyy'), 'CASH');
insert into emp_payment_tab (COMPANY_ID, PAYMENT_ID, PAYMENT_DATE, METHOD_ID)
values ('10', 202392, to_date('25-01-2022', 'dd-mm-yyyy'), 'CASH');