使用PL/SQL块打印文本与计算结果时DBMS_OUTPUT输出异常
问题排查与解决方法
- 核心语法错误导致执行中断
你代码最后一行的DBMS_OUTPUT.PUT_LINE调用存在运算优先级错误:Oracle 中字符串拼接符||的优先级高于算术运算符+,执行到该行时会先将字符串和税率计算结果拼接为字符串,再尝试和单价做数值加法,触发类型转换异常,导致整个PL/SQL块直接终止,自然不会输出任何内容。
修复方式是将整个算术运算部分用括号包裹,保证运算优先执行:
-- 修正前错误写法 DBMS_OUTPUT.PUT_Line('Total Payment = '|| receipt.unitPrice*(13/100)+(receipt.unitPrice)); -- 修正后正确写法 DBMS_OUTPUT.PUT_Line('Total Payment = '|| (receipt.unitPrice*(13/100) + receipt.unitPrice));
DBMS_OUTPUT代码显示灰色的原因
Oracle SQL Developer 的语法检测机制如果识别到当前代码块存在语法错误、或者当前编辑窗口未关联有效的数据库连接,就会将判定为「无法正常执行」的代码标记为灰色。你修复上述语法错误后,灰色标记通常会自动消失。补充排查项
如果修复语法后仍无输出,可在代码末尾增加异常捕获块,判断是否是SELECT INTO语句未匹配到PRODUCTID=1的数据,抛出NO_DATA_FOUND异常导致执行中断,完整修正代码如下:
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)); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('未查询到PRODUCTID为1的产品数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('执行错误:'||SQLERRM); END;
执行修正后的代码即可正常看到输出内容。
内容的提问来源于stack exchange,提问作者Ricky Lee
相关产品推荐
相关产品推荐

