【问题标题】:How to locate the accurate postion in pl/sql promptly (ORA-06502: PL/SQL)如何在 pl/sql 提示符中定位准确位置 (ORA-06502: PL/SQL)
【发布时间】:2012-06-29 19:45:01
【问题描述】:

我有一个 select 语句,需要在我的 pl/sql 中选择几十列到自定义变量中。如下:

  select col1,
         col2,
         ....
         col30
  into   var1,
         ...
         var30
  from   table
  where ....

在执行 SP 时遇到错误:

ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太 小

错误信息只指出了select语句的第一行。即使我能弄清楚我定义的变量太小而无法容纳列,它仍然让我很难精确定位错误定义的变量。这对我来说不是调试这个 sp 的有效方法。

有没有更好的办法,请指教。

【问题讨论】:

  • 为了调试把它分成更小的组怎么样?一旦你发现问题出在哪里,你就可以在一个语句中再次找出它们。
  • 如果您选择简单的列,将变量定义为var1 table.col1%TYPE 等会很有帮助,而不是指定可能会出错的varchar2 长度。 (如果表定义发生变化,这也避免了修改代码)。您可能仍需要为某些列手动定义变量,例如如果您有函数调用或串联,但如果您看到此错误,则检查的次数会更少。还要仔细检查selectinto 中的列是否具有相同的顺序,这对于很多列有时并不明显。

标签: oracle plsql


【解决方案1】:

pl/sql 中通常使用两个选项:

1.使用 %type 在 PL/SQL 中定义变量以匹配表的定义。

define
  v_col1 my_table.col1%type;
  v_col2 my_table.col2%type;
begin
  select col1,col2
  into v_col1, v_col2
  from my_table
  -- some condition that pulls 1 row
  where rownum = 1;
end;

2.定义一个行变量,使用%rowtype

define
  v_my_table_row my_table%rowtype;
begin
  select *
  into v_my_table_row
  from my_table
  where rownum = 1;

end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2021-12-26
    相关资源
    最近更新 更多