我在执行此过程时在客户端遇到此错误:
create or replace procedure remove_indice (p_tabela in varchar2, p_indice in varchar2) is
v_qtde integer;
begin
select count(*) into v_qtde from user_indexes where index_name = upper(p_indice);
if v_qtde = 0 then
begin
dbms_output.put_line('indice ' || p_indice || ' nao removido (nao existe).');
end;
else
begin
execute immediate('drop index ' || p_indice);
dbms_output.put_line('indice ' || p_indice || ' removido com sucesso.');
end;
end if;
exception
when others then
dbms_output.put_line('nao foi possivel remover o indice ' || p_indice);
dbms_output.put_line('erro: ' || sqlerrm);
raise;
end;
S1000 6502 {[Oracle] [ODBC] [Ora] ORA-06502:PL / SQL:数值或值错误:字符串缓冲区太小 ORA-06512:at" SITEF.REMOVE_INDICE",第21行 ORA-06512:第1行
{call remove_indice(' conc_ticket_ll',' conc_ticket_ll_indx1')}
然后我将程序更改为此,因为错误似乎发生在" raise":
create or replace procedure remove_indice (p_tabela in varchar2, p_indice in varchar2) is
v_qtde integer;
begin
select count(*) into v_qtde from user_indexes where index_name = upper(p_indice);
if v_qtde = 0 then
begin
dbms_output.put_line('indice ' || p_indice || ' nao removido (nao existe).');
end;
else
begin
execute immediate('drop index ' || p_indice);
dbms_output.put_line('indice ' || p_indice || ' removido com sucesso.');
end;
end if;
end;
然后我明白了:
S1000 6502 {[Oracle] [ODBC] [Ora] ORA-06502:PL / SQL:数值或值错误:字符串缓冲区太小 ORA-06512:第1行 ORA-06512:at" SITEF.REMOVE_INDICE",第13行 ORA-06512:第1行
在我的环境中,错误不会发生。该过程简单检查索引是否存在,如果存在则将其删除。如果不存在,请不要错误地停止应用程序(它是安装程序)。
一些说明: 1-通过ODBC建立连接; 2-在客户端环境中,错误不会通过SqlPlus发生:
set serveroutput on;
begin
remove_indice ('conc_ticket_ll', 'conc_ticket_ll_indx1');
end;
indice conc_ticket_ll_indx1 removido com Sucesso的。
PL / SQL程序已成功完成。
我在同一版本的同一个操作系统中使用了<3> Oracle ODBC驱动程序。