【问题标题】:Error on DBMS output while printing text and calculated result using PL/SQL block使用 PL/SQL 块打印文本和计算结果时 DBMS 输出出错
【发布时间】:2021-12-01 12:08:59
【问题描述】:

我正在使用 Oracle SQL 开发人员制作 PL/SQL 代码。 我的代码是使用 DBMS_Output 中的数学公式来打印数据。 但是,以 DBMS_OUTPUT.PUT_LINE 开头的代码都是灰色的,并且不打印任何内容。 我已经通过单击视图 -> DBMS 输出 -> 加号 -> 连接到服务器来使用 DBMS 输出,所以我认为禁用的 DBMS 输出不是问题。 你能帮帮我吗?

DECLARE
type Receipt is record(
productID PRODUCTS.PRODUCTID%type,
productName PRODUCTS.PRODUCTNAME%type,
numOfProduct PRODUCTS.UNITSONORDER%type,
unitPrice PRODUCTS.UNITPRICE%type);
receipt Receipt;
BEGIN
    select PRODUCTID,PRODUCTNAME, UNITSONORDER, UNITPRICE
    into receipt
    from PRODUCTS where PRODUCTID = 1;
    
DBMS_OUTPUT.PUT_LINE('Product ID : '|| receipt.productID);
DBMS_OUTPUT.PUT_LINE('Product Name : '|| receipt.productName);
DBMS_OUTPUT.PUT_LINE('Number of orders : '|| receipt.numOfProduct);
DBMS_OUTPUT.PUT_Line('Unit price : '|| receipt.unitPrice);
DBMS_OUTPUT.PUT_Line('sub-total'|| receipt.unitPrice);
DBMS_OUTPUT.PUT_Line('Taxes = '|| receipt.unitPrice*(13/100));
DBMS_OUTPUT.PUT_Line('Total Payment = '|| receipt.unitPrice*(13/100)+(receipt.unitPrice));
END;

【问题讨论】:

  • 当您尝试运行该代码时,您应该会遇到许多语法错误。以ORA-06550: line 7, column 9: PLS-00371: at most one declaration for 'RECEIPT' is permitted ORA-06550: line 7, column 9: 开头
  • 请注意对象名称中的大小写。 Oracle 名称不区分大小写 因此receiptReceipt 是相同的并且引用相同的对象。 (在内部它们被折叠成大写。)。这就是导致重新定义 (PLS-00371: ) 错误的原因。

标签: sql oracle plsql


【解决方案1】:

当您尝试运行此代码时,您应该会遇到一些语法错误,因为您无法声明记录类型 receipt 并声明局部变量 receipt。只允许声明一个receipt。也许您来自一种区分大小写的编程语言,其中Receiptreceipt 将是不同的标识符?

如果我们将类型声明更改为不同的标识符receipt_rec,那么您的代码大部分都可以编译。您只是在最后的 dbms_output 调用中遇到问题,因为 Oracle 认为您正在尝试将 + 符号左侧的所有内容添加到 + 符号右侧的值,而不是进行算术运算然后将其连接到字符串文本。我会将整个计算包含在 to_char 中,但只需添加括号来强制执行您想要的操作顺序就足够了。通常情况下,将数值计算到一个单独的局部变量中并打印出该局部变量会更有意义。

DECLARE
type Receipt_rec is record(
  productID PRODUCTS.PRODUCTID%type,
  productName PRODUCTS.PRODUCTNAME%type,
  numOfProduct PRODUCTS.UNITSONORDER%type,
  unitPrice PRODUCTS.UNITPRICE%type);
receipt Receipt_rec;
BEGIN
    select PRODUCTID,PRODUCTNAME, UNITSONORDER, UNITPRICE
    into receipt
    from PRODUCTS where PRODUCTID = 1;
    
DBMS_OUTPUT.PUT_LINE('Product ID : '|| receipt.productID);
DBMS_OUTPUT.PUT_LINE('Product Name : '|| receipt.productName);
DBMS_OUTPUT.PUT_LINE('Number of orders : '|| receipt.numOfProduct);
DBMS_OUTPUT.PUT_Line('Unit price : '|| receipt.unitPrice);
DBMS_OUTPUT.PUT_Line('sub-total'|| receipt.unitPrice);
DBMS_OUTPUT.PUT_Line('Taxes = '|| receipt.unitPrice*(13/100));
DBMS_OUTPUT.PUT_Line('Total Payment = '|| ( receipt.unitPrice*(13/100)+(receipt.unitPrice) ));
END;
/

这里是a dbfiddle

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2015-02-24
    • 2019-07-29
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多