当前位置: 首页 > 知识库问答 >
问题:

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

赵夕
2023-03-14

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

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

我使用的代码是这样的:

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(相当于智利的社会安全号码)以显示不同的结果,所以我应该为此使用循环吗?

共有1个答案

乔伯寅
2023-03-14

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


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;
 类似资料:
  • 问题内容: 我想执行匿名PL / SQL,并需要获取结果集对象。我得到了可以通过使用PL / SQL块内的游标完成的代码。 但是PL / SQL块本身将以文本形式来自数据库。因此,我无法编辑该PL / SQL块。并且它将仅返回两个其列名始终相同的值。它将返回2个列组合值的列表。 在这里,我给出示例PL / SQL。 任何回复都将非常有帮助。 问题答案: 这是一个如何“执行匿名PL / SQL并获取

  • 问题内容: 我想使用,但是行数仅超过1。表中没有任何东西按顺序递增,所以我不能使用循环。有什么方法可以打印出表格中的每一行? 问题答案: 尝试这样的事情。

  • 本文向大家介绍Oracle DBMS中的PL / SQL块,包括了Oracle DBMS中的PL / SQL块的使用技巧和注意事项,需要的朋友参考一下 PL / SQL是一种块结构语言,即PL./SQL的代码以块的形式编写。PL / SQL还包含Oracle数据库的健壮性,安全性和可移植性。 PL / SQL的每个块均包含以下子部分- 声明- 本节包含所有需要在程序之前声明的项目,例如变量,子程序

  • 可能重复: 什么是双大括号初始化在Java? 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: 在调试模式下运行代码后,我发现匿名块是在调用构造函数之后调用的。上面的功能和做的有什么不同: ?我会认为它们在功能上是等价的,并且会认为后一种方式是更好/更干净的编写代码的方式。

  • 问题内容: 在Groovy中是否可以使用匿名代码块?例如,我正在尝试将以下Java代码转换为Groovy: 我能想到的最接近的翻译如下: 我知道匿名代码块通常是一种反模式。但是具有类似“ inputStream0”和“ inputStream1”之类的变量的变量也是一种反模式,因此对于我正在处理的这段代码,匿名代码块会有所帮助。 问题答案: 您可以在Groovy中使用匿名代码块,但这些代码和闭包之

  • 问题内容: Java中是否有匿名代码块的实际用途? 请注意,这与命名块无关,即 。 问题答案: 它们限制变量范围。 但是,实际上,如果你发现自己使用了这样的代码块,则可能是你要将其重构为方法的信号。