首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PLS00215:字符串长度约束必须在范围内(1.32767)

PLS00215:字符串长度约束必须在范围内(1.32767)
EN

Stack Overflow用户
提问于 2021-07-09 13:46:31
回答 1查看 226关注 0票数 0

我对pl/sql很陌生。我想要创建一个过程,它有三个参数:'startMonth','endMonth','thirdMonth‘。在这个过程中,我正在执行一个sql查询,它位于run_sql列中的table_query中。此查询需要“startMonth”、“endMonth”、“thirdMonth”的值。我就是这么写这个程序的。我的计划是将所有sql查询放在一个单独的表中,并在过程中的for循环中执行。在那里,我创建了一个名为table1的表,在接下来的一个月中,我希望删除它并再次创建该表。我就是这样写程序的。

代码语言:javascript
运行
复制
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中的查询。

代码语言:javascript
运行
复制
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)。虽然我搜索了错误,但找不到确切的原因。这似乎是变量赋值方面的一个问题。但我无法解决它。

-最新情况

由于在答案中给出了字符串,我将字符串转换为日期。

代码语言:javascript
运行
复制
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的任何错误消息,产生此错误消息的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-09 13:53:11

错误指出了问题的所在。字符串声明(char、varchar、varchar2 --但您应该只使用varchar2,而不是varchar)需要长度;例如:

代码语言:javascript
运行
复制
CREATE OR REPLACE procedure sixMonthAverage (startMonth varchar2,endMonth varchar2 ,thirdMonth varchar2 )
IS
start_date varchar2(10) := startMonth;
end_date varchar2(10) := endMonth;
...

注意,过程参数没有指定长度;只有局部变量声明。

如果这些代表日期,那么它们和传入的参数很可能是日期,而不是字符串。这取决于您的动态SQL所期望的是什么--如果这是将字符串转换为日期并指定格式掩码,那么我想这是可以的;否则您应该被传递日期,或者将字符串转换为日期。不过,您展示的示例似乎没有任何绑定变量可供填充。

但是,删除和重新创建表通常不是您想要做的事情。您可以删除/截断并重新填充表;如果希望保留一个月以上的时间,则可以使用分区;或者使用视图(或物化视图)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68317884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档