我对pl/sql很陌生。我想要创建一个过程,它有三个参数:'startMonth','endMonth','thirdMonth‘。在这个过程中,我正在执行一个sql查询,它位于run_sql列中的table_query中。此查询需要“startMonth”、“endMonth”、“thirdMonth”的值。我就是这么写这个程序的。我的计划是将所有sql查询放在一个单独的表中,并在过程中的for循环中执行。在那里,我创建了一个名为table1的表,在接下来的一个月中,我希望删除它并再次创建该表。我就是这样写程序的。
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_query)
loop
dbms_output.put_line(startmonth);
dbms_output.put_line(endmonth);
execute immediate c_rec.run_sql using start_date, end_date;
Execute IMMEDIATE 'commit';
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Exception');
END;
这是run_sql列中table_query中的查询。
create table table1
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'||chr(32)||
startMonth ||chr(32)||'and'|| chr(32)||endMonth ||chr(32)||
'and cancellation_dtm is null;
但是,当我试图编译这个过程时,它给出了错误'PLS00215: String length约束必须在范围内(1..32767)。虽然我搜索了错误,但找不到确切的原因。这似乎是变量赋值方面的一个问题。但我无法解决它。
-最新情况
由于在答案中给出了字符串,我将字符串转换为日期。
CREATE OR REPLACE procedure REPO.sixMonthAverage (startMonth varchar2,endMonth varchar2 ,thirdMonth varchar2 )
IS
start_date date := TO_DATE(startMonth, 'yyyymm');
end_date date := TO_DATE(endMonth, 'yyyymm');
但是在执行查询时,它提供了一个错误消息,即ORA-00904:"END_DATE":无效标识符。但是它没有显示start_date的任何错误消息,产生此错误消息的原因是什么?
发布于 2021-07-09 13:53:11
错误指出了问题的所在。字符串声明(char、varchar、varchar2 --但您应该只使用varchar2,而不是varchar)需要长度;例如:
CREATE OR REPLACE procedure sixMonthAverage (startMonth varchar2,endMonth varchar2 ,thirdMonth varchar2 )
IS
start_date varchar2(10) := startMonth;
end_date varchar2(10) := endMonth;
...
注意,过程参数没有指定长度;只有局部变量声明。
如果这些代表日期,那么它们和传入的参数很可能是日期,而不是字符串。这取决于您的动态SQL所期望的是什么--如果这是将字符串转换为日期并指定格式掩码,那么我想这是可以的;否则您应该被传递日期,或者将字符串转换为日期。不过,您展示的示例似乎没有任何绑定变量可供填充。
但是,删除和重新创建表通常不是您想要做的事情。您可以删除/截断并重新填充表;如果希望保留一个月以上的时间,则可以使用分区;或者使用视图(或物化视图)。
https://stackoverflow.com/questions/68317884
复制相似问题