繁体   English   中英

考试中 PL/SQL 匿名块的问题

[英]Problem with PL/SQL anonymous block in an exam

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

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

ORA-06512: 在第 7 行

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

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

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

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

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;

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

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


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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM