首页 > 解决方案 > 考试中 PL/SQL 匿名块的问题

问题描述

我正在使用 SQLDeveloper 中的代码进行考试,但我遇到了代码问题。显示的错误是

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

ORA-06512: 在第 7 行

  1. 00000 - "PL/SQL: 数值或数值错误%s"

*原因:出现算术、数字、字符串、转换或约束错误。例如,如果尝试将值 NULL 分配给声明为 NOT NULL 的变量,或者尝试将大于 99 的整数分配给声明为 NUMBER(2) 的变量,则会发生此错误。

*行动:改变数据,如何操作,或如何声明,使值不违反约束。

我正在使用的代码是这个:

VAR RUT_CLIENTE VARCHAR2(15);
EXEC :RUT_CLIENTE:= '12487147-9';


DECLARE
    V_NOMBRE VARCHAR2(75);
    V_RUN VARCHAR2(50);
    V_RENTA VARCHAR2(12);
    V_EST_CIVIL VARCHAR2(40);
BEGIN
    SELECT 
        CLI.NOMBRE_CLI || ' ' || CLI.APPATERNO_CLI || ' ' || CLI.APMATERNO_CLI, 
        TO_CHAR(CLI.NUMRUT_CLI || '-' || CLI.DVRUT_CLI),
        TO_CHAR(CLI.RENTA_CLI, '$999G999G999'),
        EST.DESC_ESTCIVIL
        INTO V_NOMBRE, V_RUN, V_RENTA, V_EST_CIVIL
    FROM CLIENTE CLI JOIN ESTADO_CIVIL EST
    ON CLI.ID_ESTCIVIL = EST.ID_ESTCIVIL
    WHERE CLI.NUMRUT_CLI || '-' || CLI.DVRUT_CLI = :RUT_CLIENTE;
    DBMS_OUTPUT.PUT_LINE('DATOS DEL CLIENTE');
    DBMS_OUTPUT.PUT_LINE(' ');
    DBMS_OUTPUT.PUT_LINE('----------------');
    DBMS_OUTPUT.PUT_LINE(' ');
    DBMS_OUTPUT.PUT_LINE('Nombre: ' || V_NOMBRE);
    DBMS_OUTPUT.PUT_LINE('RUN: ' || V_RUN);
    DBMS_OUTPUT.PUT_LINE('Estado Civil: ' || V_EST_CIVIL);
    DBMS_OUTPUT.PUT_LINE('Renta: ' || V_RENTA);
END;

我究竟做错了什么?另外,我必须让这个块运行 3 次,每次都必须输入不同的 RUT_CLIENTE(相当于智利的社会安全号码)以显示不同的结果,所以我应该为此使用循环吗?

标签: sqloracleplsql

解决方案


如果您将使用光标中的类型定义变量,则可以避免此类错误:


DECLARE
    cursor cur(p_RUT_CLIENTE) is 
      SELECT 
          CLI.NOMBRE_CLI || ' ' || CLI.APPATERNO_CLI || ' ' || CLI.APMATERNO_CLI as col_nombre, 
          TO_CHAR(CLI.NUMRUT_CLI || '-' || CLI.DVRUT_CLI) as col_run,
          TO_CHAR(CLI.RENTA_CLI, '$999G999G999')          as col_renta,
          EST.DESC_ESTCIVIL                               as col_est_civil
      FROM CLIENTE CLI JOIN ESTADO_CIVIL EST
      ON CLI.ID_ESTCIVIL = EST.ID_ESTCIVIL
      WHERE CLI.NUMRUT_CLI || '-' || CLI.DVRUT_CLI = p_RUT_CLIENTE;
    
    V_NOMBRE    cur.col_nombre%type;
    V_RUN       cur.col_run%type;
    V_RENTA     cur.col_renta%type;
    V_EST_CIVIL cur.est_civil%type;
    
BEGIN
    open cur(:RUT_CLIENTE)
    fetch cur into INTO V_NOMBRE, V_RUN, V_RENTA, V_EST_CIVIL;
    close cur;
    
    DBMS_OUTPUT.PUT_LINE('DATOS DEL CLIENTE');
    DBMS_OUTPUT.PUT_LINE(' ');
    DBMS_OUTPUT.PUT_LINE('----------------');
    DBMS_OUTPUT.PUT_LINE(' ');
    DBMS_OUTPUT.PUT_LINE('Nombre: ' || V_NOMBRE);
    DBMS_OUTPUT.PUT_LINE('RUN: ' || V_RUN);
    DBMS_OUTPUT.PUT_LINE('Estado Civil: ' || V_EST_CIVIL);
    DBMS_OUTPUT.PUT_LINE('Renta: ' || V_RENTA);
END;

推荐阅读