执行自定义PL/SQL多表查询脚本时报错,无法定位问题原因
PL/SQL脚本错误排查及修正
错误点汇总
- 游标查询列与接收变量数量不匹配:游标
CURSOR1的SELECT语句仅返回2个字段,但FETCH INTO时向5个变量赋值,字段数量不对应导致报错。 - FROM子句语法错误:错误将表字段
COIN.PRODUCT、COIN.PRICE、COIN_DELIVERY.DELIVERY_NOTES作为表名写入FROM子句,未正确声明要关联的3张表CUSTOMER、COIN、COIN_DELIVERY,且三张表未加关联条件,会产生非法笛卡尔积。 - 输出语句语法错误:多处
DBMS_OUTPUT.PUT_LINE末尾多余拼接符||,没有后续拼接内容触发语法错误。 - 字段引用无效:WHERE条件中引用
COIN.PRICE,但原FROM子句中未声明COIN表,数据库无法识别该字段引用。
修正说明
以下修正代码默认三张表的关联逻辑为:CUSTOMER与COIN_DELIVERY通过customer_id关联,COIN与COIN_DELIVERY通过coin_id关联,你可以根据实际表的外键规则调整关联条件。
修正后完整代码
SET SERVEROUTPUT ON DECLARE TEMP_CUSTNAME CUSTOMER.FIRST_NAME%TYPE; TEMP_CUSTSURNAME CUSTOMER.SURNAME%TYPE; TEMP_COINPUR COIN.PRODUCT%TYPE; TEMP_CPRICE COIN.PRICE%TYPE; TEMP_DNOTES COIN_DELIVERY.DELIVERY_NOTES%TYPE; CURSOR CURSOR1 IS SELECT C.FIRST_NAME,C.SURNAME, CO.PRODUCT, CO.PRICE, CD.DELIVERY_NOTES FROM CUSTOMER C INNER JOIN COIN_DELIVERY CD ON C.CUSTOMER_ID = CD.CUSTOMER_ID INNER JOIN COIN CO ON CD.COIN_ID = CO.COIN_ID WHERE CO.PRICE > 8000; BEGIN OPEN CURSOR1; LOOP FETCH CURSOR1 INTO TEMP_CUSTNAME, TEMP_CUSTSURNAME, TEMP_COINPUR, TEMP_CPRICE, TEMP_DNOTES; EXIT WHEN CURSOR1%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('CUSTOMER: ' || TEMP_CUSTNAME || ',' ||TEMP_CUSTSURNAME); DBMS_OUTPUT.PUT_LINE ('COIN: ' || TEMP_COINPUR); DBMS_OUTPUT.PUT_LINE ('PRICE: ' || TEMP_CPRICE); DBMS_OUTPUT.PUT_LINE ('NOTES: ' || TEMP_DNOTES); DBMS_OUTPUT.PUT_LINE ('------------------------------------' ); END LOOP; CLOSE CURSOR1; END; /
内容的提问来源于stack exchange,提问作者Arnold Bunu
相关产品推荐
相关产品推荐

