【发布时间】:2021-06-20 08:12:29
【问题描述】:
我在 sql 表中插入了下面的查询。
select account_num,bill_seq,bill_version,
to_char(start_of_bill_dtm,'YYYYMM-DD') st_bill_dtm,
to_char(bill_dtm - 1,'YYYYMM-DD') en_bill_dtm,
to_char(actual_bill_dtm,'YYYYMM-DD') act_bill_dtm,
round((invoice_net_mny + invoice_tax_mny)/1000,0) mon_bill,
bill_type_id,bill_status
from billsummary
where to_char(bill_dtm - 1,'YYYYMM') between'||chr(32)||
startMonth ||chr(32)||'and'|| chr(32)||endMonth ||chr(32)||
'and cancellation_dtm is null
我尝试在下面的循环中执行该查询。
FOR a in 1 .. 17 LOOP
dbms_output.put_line(startmonth);
dbms_output.put_line(endmonth);
dbms_output.put_line('in the loop');
sql_query:='select run_sql from table_1';
Execute IMMEDIATE sql_query;
Execute IMMEDIATE 'commit';
END LOOP;
但它没有给出任何输出。我尝试通过硬编码“startMonth”和“endMonth”来执行相同的查询,如下所示。
select account_num,bill_seq,bill_version,
to_char(start_of_bill_dtm,'YYYYMM-DD') st_bill_dtm,
to_char(bill_dtm - 1,'YYYYMM-DD') en_bill_dtm,
to_char(actual_bill_dtm,'YYYYMM-DD') act_bill_dtm,
round((invoice_net_mny + invoice_tax_mny)/1000,0) mon_bill,
bill_type_id,bill_status
from billsummary
where to_char(bill_dtm - 1,'YYYYMM') between'202011 'and'202104'and cancellation_dtm is null
然后它起作用并给了我一个输出。变量(startMonth 和 endMonth)的值在循环中也是可见的。有谁可以找出原因吗?
更新
我更新了查询以使用解决方案中提到的绑定变量。
这是我的程序。
CREATE OR REPLACE procedure schema.sixMonthAverage (startMonth varchar,endMonth varchar ,thirdMonth varchar )
IS
start_date varchar :=:startMonth;
end_date varchar :=:endMonth;
begin
for c_rec in(select run_sql from table_1)
loop
execute immediate c_rec.run_sql using start_date, end_date;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Exception');
END;
/
这给了我“startMonth”和“endMonth”的错误“错误绑定变量”。
这就是我调用过程的方式。
Execute Schema.sixMonthAverage ('202011', '202104', '202001');
commit;
查询在 table_1 中。如下图所示。
create table tbl_six_mon_1
as
select account_num,bill_seq,bill_version,
to_char(start_of_bill_dtm,'YYYYMM-DD') st_bill_dtm,
to_char(bill_dtm - 1,'YYYYMM-DD') en_bill_dtm,
to_char(actual_bill_dtm,'YYYYMM-DD') act_bill_dtm,
round((invoice_net_mny + invoice_tax_mny)/1000,0) mon_bill,
bill_type_id,bill_status
from billsummary
where to_char(bill_dtm - 1,'YYYYMM') between :start_date and :end_date
and cancellation_dtm is null
谁能找出我方法中的错误?
【问题讨论】:
-
1.你执行
select run_sql from table_1,没有什么可提交的。尝试在控制台/IDE 中自己运行它。 PL/SQL 也是如此。 2. 您的过滤谓词包含字符串|| chr(32)||endMonth ||chr(32)||,它不是日期,并且在此条件下不会选择任何日期。 3.EXECUTE IMMEDIATE使用自己的隔离上下文执行给定的语句,因此它不知道任何外部变量。这不是用dbms_output打印的文本的执行。传递变量,需要使用using加法